Skip to content

Commit 55caa76

Browse files
authored
Merge pull request #4 from bitmaelum/develop
Serial number fix
2 parents ab8b447 + 967a076 commit 55caa76

File tree

15 files changed

+173
-96
lines changed

15 files changed

+173
-96
lines changed

.github/workflows/production.yml renamed to .github/workflows/deploy_production.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: production
1+
name: Deploy to Production
22

33
on:
44
push:

.github/workflows/staging.yml renamed to .github/workflows/deploy_staging.yml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
name: staging
1+
name: Deploy to Staging
22

33
on:
44
push:
5-
branches: [ master ]
6-
pull_request:
7-
branches: [ master ]
5+
branches: [ develop ]
86

97
jobs:
108
build:

address/dynamodb.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@ package address
22

33
import (
44
"errors"
5+
"log"
6+
"strconv"
7+
"time"
8+
59
"github.com/aws/aws-sdk-go/aws"
610
"github.com/aws/aws-sdk-go/service/dynamodb"
711
"github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute"
8-
"log"
9-
"math/rand"
10-
"strconv"
1112
)
1213

1314
type dynamoDbResolver struct {
@@ -24,7 +25,7 @@ type Record struct {
2425
Routing string `dynamodbav:"routing"`
2526
PublicKey string `dynamodbav:"public_key"`
2627
Proof string `dynamodbav:"proof"`
27-
Serial int `dynamodbav:"sn"`
28+
Serial uint64 `dynamodbav:"sn"`
2829
}
2930

3031
// NewDynamoDBResolver returns a new resolver based on DynamoDB
@@ -36,14 +37,14 @@ func NewDynamoDBResolver(client *dynamodb.DynamoDB, tableName string) Repository
3637
}
3738

3839
func (r *dynamoDbResolver) Update(info *ResolveInfoType, routing, publicKey string) (bool, error) {
39-
serial := strconv.Itoa(rand.Int())
40+
serial := strconv.FormatUint(uint64(time.Now().UnixNano()), 10)
4041

4142
input := &dynamodb.UpdateItemInput{
4243
ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{
4344
":s": {S: aws.String(routing)},
4445
":pk": {S: aws.String(publicKey)},
4546
":sn": {N: aws.String(serial)},
46-
":csn": {N: aws.String(strconv.Itoa(info.Serial))},
47+
":csn": {N: aws.String(strconv.FormatUint(info.Serial, 10))},
4748
},
4849
TableName: aws.String(r.TableName),
4950
UpdateExpression: aws.String("SET routing=:s, public_key=:pk, sn=:sn"),
@@ -68,7 +69,7 @@ func (r *dynamoDbResolver) Create(hash, routing, publicKey, proof string) (bool,
6869
Routing: routing,
6970
PublicKey: publicKey,
7071
Proof: proof,
71-
Serial: rand.Int(),
72+
Serial: uint64(time.Now().UnixNano()),
7273
}
7374

7475
av, err := dynamodbattribute.MarshalMap(record)

address/repository.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package address
22

33
import (
4+
"os"
5+
46
"github.com/aws/aws-sdk-go/aws/session"
57
"github.com/aws/aws-sdk-go/service/dynamodb"
6-
"os"
78
)
89

910
// ResolveInfoType returns information found in the resolver repository
@@ -12,7 +13,7 @@ type ResolveInfoType struct {
1213
RoutingID string
1314
PubKey string
1415
Proof string
15-
Serial int
16+
Serial uint64
1617
}
1718

1819
// Repository to resolve records

go.mod

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@ go 1.13
55
require (
66
github.com/aws/aws-lambda-go v1.19.1
77
github.com/aws/aws-sdk-go v1.34.14
8-
github.com/bitmaelum/bitmaelum-suite v0.0.0-20200903072357-5b8a727a984e
9-
github.com/davecgh/go-spew v1.1.1
8+
github.com/bitmaelum/bitmaelum-suite v0.0.0-20200920071300-2c1d7ed2637f
109
github.com/fzipp/gocyclo v0.0.0-20150627053110-6acd4345c835 // indirect
1110
github.com/gordonklaus/ineffassign v0.0.0-20200809085317-e36bfde3bb78 // indirect
1211
github.com/stretchr/testify v1.6.1
1312
golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect
14-
golang.org/x/tools v0.0.0-20200923053713-ba800b16d873 // indirect
13+
golang.org/x/tools v0.0.0-20201002055958-0d28ed0cbe40 // indirect
1514
)

go.sum

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ github.com/aws/aws-sdk-go v1.34.14/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZve
1616
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
1717
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
1818
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
19-
github.com/bitmaelum/bitmaelum-suite v0.0.0-20200903072357-5b8a727a984e h1:nLU+d0D6R0YbxxLlMTb0Wjp6PQIgT+L5+SGu0T0QDvE=
20-
github.com/bitmaelum/bitmaelum-suite v0.0.0-20200903072357-5b8a727a984e/go.mod h1:reXCnSRPYujQURux4JCAme5UAFmqv74j9dVxqkx21/8=
19+
github.com/bitmaelum/bitmaelum-suite v0.0.0-20200920071300-2c1d7ed2637f h1:D+DZwTZIEOBfpPU7Wlk8i3wMf7qGStslwkPU6z53Bsw=
20+
github.com/bitmaelum/bitmaelum-suite v0.0.0-20200920071300-2c1d7ed2637f/go.mod h1:UJVrJfuR1TgSoPTrd0S1cAzP936oMTpV9/k1bEGMj5s=
2121
github.com/c2h5oh/datasize v0.0.0-20200112174442-28bbd4740fee/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M=
2222
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
2323
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
@@ -42,6 +42,7 @@ github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8
4242
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
4343
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
4444
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
45+
github.com/ernesto-jimenez/httplogger v0.0.0-20150224132909-86cc44f6150a/go.mod h1:zroVJTjbZUlS0lcewJlcPsS6JQIoFWePhxjOF0/n0f4=
4546
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
4647
github.com/fzipp/gocyclo v0.0.0-20150627053110-6acd4345c835 h1:roDmqJ4Qes7hrDOsWsMCce0vQHz3xiMPjJ9m4c2eeNs=
4748
github.com/fzipp/gocyclo v0.0.0-20150627053110-6acd4345c835/go.mod h1:BjL/N0+C+j9uNX+1xcNuM9vdSIcXCZrQZUYbXOFbgN8=
@@ -248,10 +249,10 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
248249
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
249250
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa h1:5E4dL8+NgFOgjwbTKz+OOEGGhP+ectTmF842l6KjupQ=
250251
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
251-
golang.org/x/tools v0.0.0-20200918232735-d647fc253266 h1:k7tVuG0g1JwmD3Jh8oAl1vQ1C3jb4Hi/dUl1wWDBJpQ=
252-
golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
253-
golang.org/x/tools v0.0.0-20200923053713-ba800b16d873 h1:Q5Sq7Lt0bkn6Ax1NAraQhKRN7xxxy1LV4guxsyFHZx4=
254-
golang.org/x/tools v0.0.0-20200923053713-ba800b16d873/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
252+
golang.org/x/tools v0.0.0-20200929175058-fc8742f94788 h1:0ke3pVIkdCHG9YUVT0cgwuxnrL5pAF9ysE4C27HTQrQ=
253+
golang.org/x/tools v0.0.0-20200929175058-fc8742f94788/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
254+
golang.org/x/tools v0.0.0-20201002055958-0d28ed0cbe40 h1:ErPN1Z9An7dXc56pRUCKgWJkjYzc3hE+y15ky9E8qxU=
255+
golang.org/x/tools v0.0.0-20201002055958-0d28ed0cbe40/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
255256
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
256257
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
257258
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

handler_address.go

Lines changed: 75 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@ package main
22

33
import (
44
"encoding/json"
5+
"log"
6+
"regexp"
7+
"strconv"
8+
"strings"
9+
510
"github.com/aws/aws-lambda-go/events"
11+
pkgAddress "github.com/bitmaelum/bitmaelum-suite/pkg/address"
612
"github.com/bitmaelum/bitmaelum-suite/pkg/bmcrypto"
713
"github.com/bitmaelum/bitmaelum-suite/pkg/proofofwork"
814
"github.com/bitmaelum/key-resolver-go/address"
9-
"log"
10-
"regexp"
11-
"strings"
15+
"github.com/bitmaelum/key-resolver-go/organisation"
1216
)
1317

1418
type addressUploadBody struct {
@@ -17,6 +21,11 @@ type addressUploadBody struct {
1721
Proof proofofwork.ProofOfWork `json:"proof"`
1822
}
1923

24+
type organizationRequestBody struct {
25+
UserHash string `json:"user_hash"`
26+
OrganizationHash string `json:"org_hash"`
27+
}
28+
2029
func getAddressHash(hash string, _ events.APIGatewayV2HTTPRequest) *events.APIGatewayV2HTTPResponse {
2130
repo := address.GetResolveRepository()
2231
info, err := repo.Get(hash)
@@ -30,10 +39,11 @@ func getAddressHash(hash string, _ events.APIGatewayV2HTTPRequest) *events.APIGa
3039
return createError("hash not found", 404)
3140
}
3241

33-
data := jsonOut{
34-
"hash": info.Hash,
35-
"routing_id": info.RoutingID,
36-
"public_key": info.PubKey,
42+
data := rawJSONOut{
43+
"hash": info.Hash,
44+
"routing_id": info.RoutingID,
45+
"public_key": info.PubKey,
46+
"serial_number": info.Serial,
3747
}
3848

3949
return createOutput(data, 200)
@@ -68,6 +78,21 @@ func postAddressHash(hash string, req events.APIGatewayV2HTTPRequest) *events.AP
6878
}
6979

7080
func deleteAddressHash(hash string, req events.APIGatewayV2HTTPRequest) *events.APIGatewayV2HTTPResponse {
81+
requestBody := &organizationRequestBody{}
82+
err := json.Unmarshal([]byte(req.Body), requestBody)
83+
if err != nil {
84+
log.Print(err)
85+
return createError("invalid body data", 400)
86+
}
87+
88+
if requestBody.OrganizationHash != "" {
89+
return deleteAddressHashByOrganization(hash, requestBody, req)
90+
}
91+
92+
return deleteAddressHashByOwner(hash, req)
93+
}
94+
95+
func deleteAddressHashByOwner(hash string, req events.APIGatewayV2HTTPRequest) *events.APIGatewayV2HTTPResponse {
7196
repo := address.GetResolveRepository()
7297
current, err := repo.Get(hash)
7398
if err != nil {
@@ -79,7 +104,7 @@ func deleteAddressHash(hash string, req events.APIGatewayV2HTTPRequest) *events.
79104
return createError("cannot find record", 404)
80105
}
81106

82-
if !validateSignature(req, current.PubKey, current.Hash+current.RoutingID) {
107+
if !validateSignature(req, current.PubKey, current.Hash+current.RoutingID+strconv.FormatUint(current.Serial, 10)) {
83108
return createError("unauthenticated", 401)
84109
}
85110

@@ -92,8 +117,49 @@ func deleteAddressHash(hash string, req events.APIGatewayV2HTTPRequest) *events.
92117
return createOutput("ok", 200)
93118
}
94119

120+
func deleteAddressHashByOrganization(hash string, organizationInfo *organizationRequestBody, req events.APIGatewayV2HTTPRequest) *events.APIGatewayV2HTTPResponse {
121+
addressRepo := address.GetResolveRepository()
122+
currentAddress, err := addressRepo.Get(hash)
123+
if err != nil {
124+
log.Print(err)
125+
return createError("error while fetching address record", 500)
126+
}
127+
128+
orgRepo := organisation.GetResolveRepository()
129+
currentOrg, err := orgRepo.Get(organizationInfo.OrganizationHash)
130+
if err != nil {
131+
log.Print(err)
132+
return createError("error while fetching organization record", 500)
133+
}
134+
135+
if currentAddress == nil {
136+
return createError("cannot find address record", 404)
137+
}
138+
139+
if currentOrg == nil {
140+
return createError("cannot find organization record", 404)
141+
}
142+
143+
//Checks if the userhash+orghash matches the hash to be deleted
144+
if !pkgAddress.VerifyHash(hash, organizationInfo.UserHash, organizationInfo.OrganizationHash) {
145+
return createError("error validating address", 401)
146+
}
147+
148+
if !validateSignature(req, currentOrg.PubKey, currentAddress.Hash+strconv.FormatUint(currentAddress.Serial, 10)) {
149+
return createError("unauthenticated", 401)
150+
}
151+
152+
res, err := addressRepo.Delete(currentAddress.Hash)
153+
if err != nil || res == false {
154+
log.Print(err)
155+
return createError("error while deleting address record", 500)
156+
}
157+
158+
return createOutput("ok", 200)
159+
}
160+
95161
func updateAddress(uploadBody addressUploadBody, req events.APIGatewayV2HTTPRequest, current *address.ResolveInfoType) *events.APIGatewayV2HTTPResponse {
96-
if !validateSignature(req, current.PubKey, current.Hash+current.RoutingID) {
162+
if !validateSignature(req, current.PubKey, current.Hash+current.RoutingID+strconv.FormatUint(current.Serial, 10)) {
97163
return createError("unauthenticated", 401)
98164
}
99165

handler_organisation.go

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,19 @@ package main
22

33
import (
44
"encoding/json"
5+
"log"
6+
"strconv"
7+
58
"github.com/aws/aws-lambda-go/events"
69
"github.com/bitmaelum/bitmaelum-suite/pkg/bmcrypto"
710
"github.com/bitmaelum/bitmaelum-suite/pkg/proofofwork"
811
"github.com/bitmaelum/key-resolver-go/organisation"
9-
"log"
1012
)
1113

1214
type organisationUploadBody struct {
13-
PublicKey bmcrypto.PubKey `json:"public_key"`
14-
Proof proofofwork.ProofOfWork `json:"proof"`
15+
PublicKey bmcrypto.PubKey `json:"public_key"`
16+
Proof proofofwork.ProofOfWork `json:"proof"`
17+
Validations []string `json:"validations"`
1518
}
1619

1720
func getOrganisationHash(hash string, _ events.APIGatewayV2HTTPRequest) *events.APIGatewayV2HTTPResponse {
@@ -27,9 +30,11 @@ func getOrganisationHash(hash string, _ events.APIGatewayV2HTTPRequest) *events.
2730
return createError("hash not found", 404)
2831
}
2932

30-
data := jsonOut{
31-
"hash": info.Hash,
32-
"public_key": info.PubKey,
33+
data := rawJSONOut{
34+
"hash": info.Hash,
35+
"public_key": info.PubKey,
36+
"validations": info.Validations,
37+
"serial_number": info.Serial,
3338
}
3439

3540
return createOutput(data, 200)
@@ -75,7 +80,7 @@ func deleteOrganisationHash(hash string, req events.APIGatewayV2HTTPRequest) *ev
7580
return createError("cannot find record", 404)
7681
}
7782

78-
if !validateSignature(req, current.PubKey, current.Hash) {
83+
if !validateSignature(req, current.PubKey, current.Hash+strconv.FormatUint(current.Serial, 10)) {
7984
return createError("unauthenticated", 401)
8085
}
8186

@@ -89,12 +94,12 @@ func deleteOrganisationHash(hash string, req events.APIGatewayV2HTTPRequest) *ev
8994
}
9095

9196
func updateOrganisation(uploadBody organisationUploadBody, req events.APIGatewayV2HTTPRequest, current *organisation.ResolveInfoType) *events.APIGatewayV2HTTPResponse {
92-
if !validateSignature(req, current.PubKey, current.Hash) {
97+
if !validateSignature(req, current.PubKey, current.Hash+strconv.FormatUint(current.Serial, 10)) {
9398
return createError("unauthenticated", 401)
9499
}
95100

96101
repo := organisation.GetResolveRepository()
97-
res, err := repo.Update(current, uploadBody.PublicKey.String(), uploadBody.Proof.String())
102+
res, err := repo.Update(current, uploadBody.PublicKey.String(), uploadBody.Proof.String(), uploadBody.Validations)
98103

99104
if err != nil || res == false {
100105
log.Print(err)
@@ -110,7 +115,7 @@ func createOrganisation(hash string, uploadBody organisationUploadBody) *events.
110115
}
111116

112117
repo := organisation.GetResolveRepository()
113-
res, err := repo.Create(hash, uploadBody.PublicKey.String(), uploadBody.Proof.String())
118+
res, err := repo.Create(hash, uploadBody.PublicKey.String(), uploadBody.Proof.String(), uploadBody.Validations)
114119

115120
if err != nil || res == false {
116121
log.Print(err)

handler_routing.go

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ package main
22

33
import (
44
"encoding/json"
5+
"log"
6+
"net"
7+
"strconv"
8+
59
"github.com/aws/aws-lambda-go/events"
610
"github.com/bitmaelum/bitmaelum-suite/pkg/bmcrypto"
711
"github.com/bitmaelum/key-resolver-go/routing"
8-
"log"
9-
"net"
1012
)
1113

1214
type routingUploadBody struct {
@@ -27,10 +29,11 @@ func getRoutingHash(hash string, _ events.APIGatewayV2HTTPRequest) *events.APIGa
2729
return createError("hash not found", 404)
2830
}
2931

30-
data := jsonOut{
31-
"hash": info.Hash,
32-
"routing": info.Routing,
33-
"public_key": info.PubKey,
32+
data := rawJSONOut{
33+
"hash": info.Hash,
34+
"routing": info.Routing,
35+
"public_key": info.PubKey,
36+
"serial_number": info.Serial,
3437
}
3538

3639
return createOutput(data, 200)
@@ -65,7 +68,7 @@ func postRoutingHash(hash string, req events.APIGatewayV2HTTPRequest) *events.AP
6568
}
6669

6770
func updateRouting(uploadBody routingUploadBody, req events.APIGatewayV2HTTPRequest, current *routing.ResolveInfoType) *events.APIGatewayV2HTTPResponse {
68-
if !validateSignature(req, current.PubKey, current.Hash) {
71+
if !validateSignature(req, current.PubKey, current.Hash+strconv.FormatUint(current.Serial, 10)) {
6972
return createError("unauthenticated", 401)
7073
}
7174

@@ -104,7 +107,7 @@ func deleteRoutingHash(hash string, req events.APIGatewayV2HTTPRequest) *events.
104107
return createError("cannot find record", 404)
105108
}
106109

107-
if !validateSignature(req, current.PubKey, current.Hash) {
110+
if !validateSignature(req, current.PubKey, current.Hash+strconv.FormatUint(current.Serial, 10)) {
108111
return createError("unauthenticated", 401)
109112
}
110113

http.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
)
1212

1313
type jsonOut map[string]string
14+
type rawJSONOut map[string]interface{}
1415

1516
// createError creates an error message json structure
1617
func createError(msg string, statusCode int) *events.APIGatewayV2HTTPResponse {

0 commit comments

Comments
 (0)