Skip to content

Commit a469b6e

Browse files
committed
fix(key): fix local keystore key.ID encoding, require ID match keys
Local key store now requires that any private or public key added to the store *must* match it's key identifier (must be hash of public key, or inlined public key). By having the keystore require key identifiers cryptographically match the public key they're storing we have the same assertion in reverse when we fetch the key by it's itentifier from the store. This is a crucial proof when key identifiers are used in tokens. Also fix a number of small errors & discrepencies between local & in-mem stores of profiles & keys
1 parent 24af0d9 commit a469b6e

File tree

10 files changed

+82
-36
lines changed

10 files changed

+82
-36
lines changed

auth/key/keybook.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -107,16 +107,16 @@ func (mkb *memoryKeyBook) AddPrivKey(k ID, sk ic.PrivKey) error {
107107
func (mkb *memoryKeyBook) MarshalJSON() ([]byte, error) {
108108
mkb.RLock()
109109
res := map[string]interface{}{}
110-
pubKeys := map[ID]string{}
111-
privKeys := map[ID]string{}
110+
pubKeys := map[string]string{}
111+
privKeys := map[string]string{}
112112
for k, v := range mkb.pks {
113113
byteKey, err := ic.MarshalPublicKey(v)
114114
if err != nil {
115115
// skip/don't marshal ill formed keys
116116
log.Debugf("keybook: failed to marshal key: %q", err.Error())
117117
continue
118118
}
119-
pubKeys[k] = ic.ConfigEncodeKey(byteKey)
119+
pubKeys[k.Pretty()] = ic.ConfigEncodeKey(byteKey)
120120
}
121121
for k, v := range mkb.sks {
122122
byteKey, err := ic.MarshalPrivateKey(v)
@@ -125,7 +125,7 @@ func (mkb *memoryKeyBook) MarshalJSON() ([]byte, error) {
125125
log.Debugf("keybook: failed to marshal key: %q", err.Error())
126126
continue
127127
}
128-
privKeys[k] = ic.ConfigEncodeKey(byteKey)
128+
privKeys[k.Pretty()] = ic.ConfigEncodeKey(byteKey)
129129
}
130130

131131
res["public_keys"] = pubKeys
@@ -152,7 +152,11 @@ func (mkb *memoryKeyBook) UnmarshalJSON(data []byte) error {
152152
if err != nil {
153153
return err
154154
}
155-
err = mkb.AddPubKey(ID(k), key)
155+
id, err := DecodeID(k)
156+
if err != nil {
157+
return err
158+
}
159+
err = mkb.AddPubKey(id, key)
156160
if err != nil {
157161
return err
158162
}
@@ -168,7 +172,11 @@ func (mkb *memoryKeyBook) UnmarshalJSON(data []byte) error {
168172
if err != nil {
169173
return err
170174
}
171-
err = mkb.AddPrivKey(ID(k), key)
175+
id, err := DecodeID(k)
176+
if err != nil {
177+
return err
178+
}
179+
err = mkb.AddPrivKey(id, key)
172180
if err != nil {
173181
return err
174182
}

auth/key/store.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ import (
1313
"github.com/theckman/go-flock"
1414
)
1515

16+
// ErrKeyAndIDMismatch occurs when a key identifier doesn't match it's public
17+
// key
18+
var ErrKeyAndIDMismatch = fmt.Errorf("public key does not match identifier")
19+
1620
// Store is an abstraction over a KeyBook
1721
// In the future we may expand this interface to store symmetric encryption keys
1822
type Store interface {
@@ -101,6 +105,9 @@ func (s *localStore) AddPubKey(keyID ID, pubKey crypto.PubKey) error {
101105
if err != nil {
102106
return err
103107
}
108+
if !keyID.MatchesPublicKey(pubKey) {
109+
return fmt.Errorf("%w id: %q", ErrKeyAndIDMismatch, keyID.Pretty())
110+
}
104111
err = kb.AddPubKey(keyID, pubKey)
105112
if err != nil {
106113
return err
@@ -114,6 +121,10 @@ func (s *localStore) AddPrivKey(keyID ID, privKey crypto.PrivKey) error {
114121
s.Lock()
115122
defer s.Unlock()
116123

124+
if !keyID.MatchesPrivateKey(privKey) {
125+
return fmt.Errorf("%w id: %q", ErrKeyAndIDMismatch, keyID.Pretty())
126+
}
127+
117128
kb, err := s.keys()
118129
if err != nil {
119130
return err

auth/key/store_test.go

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

33
import (
4+
"errors"
45
"io/ioutil"
56
"path/filepath"
67
"testing"
78

89
"github.com/google/go-cmp/cmp"
10+
"github.com/libp2p/go-libp2p-core/peer"
911
"github.com/qri-io/qri/auth/key"
1012
testkeys "github.com/qri-io/qri/auth/key/test"
1113
)
@@ -24,17 +26,27 @@ func TestLocalStore(t *testing.T) {
2426
}
2527

2628
kd0 := testkeys.GetKeyData(0)
27-
k0AltID := key.ID("key_id_0")
28-
err = ks.AddPubKey(k0AltID, kd0.PrivKey.GetPublic())
29-
if err != nil {
29+
30+
if err = ks.AddPubKey(peer.ID("this_must_fail"), kd0.PrivKey.GetPublic()); err == nil {
31+
t.Error("expected adding public key with mismatching ID to fail. got nil")
32+
} else if !errors.Is(err, key.ErrKeyAndIDMismatch) {
33+
t.Errorf("mismatched ID error must wrap exported pacakge error, got: %s", err)
34+
}
35+
36+
if err = ks.AddPubKey(kd0.PeerID, kd0.PrivKey.GetPublic()); err != nil {
3037
t.Fatal(err)
3138
}
3239

33-
err = ks.AddPrivKey(k0AltID, kd0.PrivKey)
34-
if err != nil {
40+
if err = ks.AddPrivKey(kd0.PeerID, kd0.PrivKey); err != nil {
3541
t.Fatal(err)
3642
}
3743

44+
if err = ks.AddPrivKey(peer.ID("this_must_fail"), kd0.PrivKey); err == nil {
45+
t.Error("expected adding private key with mismatching ID to fail. got nil")
46+
} else if !errors.Is(err, key.ErrKeyAndIDMismatch) {
47+
t.Errorf("mismatched ID error must wrap exported pacakge error, got: %s", err)
48+
}
49+
3850
golden := "testdata/keystore.json"
3951
path = filepath.Join(path, "keystore_test.json")
4052
f1, err := ioutil.ReadFile(golden)

auth/key/testdata/keystore.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"private_keys":{"key_id_0":"CAASqAkwggSkAgEAAoIBAQChp1HiZxTsLQCaHmW3/cc2ZDZpgLwn5o1/nZPgqT7SyXHP5bn7GQMG3kPEQWcl4nhtLX9hkrBEskHrdIlqp9zXFMwBfat+qfzCylGC/QBDF7wT9umLd7nbq7pAxQXteXgntt2Zhg4gE/kEk7vIyL+P9KpWJZ/yjpykgsDC7NPnrr8qZBo2tL0F4w+33nZhEx7Pp7Rnaq22JM8rF+NHCgSkUh63lp7Vhwm9PQoGtt0XTnEKxrMQnUme/IhGNxs84RphxHc5+nW6jYjgm5bcJonGyPU7bq+v51Mr2Ol4RT3L9ZNJgz0SWTSmAtiBLx2ryLrTjmDPSvN7wLm9sWEdWmRVAgMBAAECggEBAJMumrl+jWgz2TZ5sreBEp6NQ5VvpuDVY8PrnzaQIikdTMizK1BaB417VUwdGGM//dG5+R7HxkHl42sT4gH/8GzL/Krm1vwunXplZy3SWSi9NXsf9qgLTGebxasvOCRt0l6mesFLcxT12ma2c+VuEixp4aUqAKWB/1Ex03wm0RFBcSttPHe5ODW8Eaz+ZU8cpObEcZdCIPVxeWqLVdkAImOmsknL0EAxP8Wo/V6Rh5Cg4PnwnfJiQ45C+m6h7NTIw0H4UOncv7EBABra6LqF6Uoda9vmv8CpwaXwR557DPchQglFjtm48jWGeVKO3Zyutizu420eRrFZ0GmJo5flvkkCgYEA0SLysOZNxDgjYA0ihVYL6UbCvYUSADuDyTWREOUiRfmxAmS1xN9o7fieCJnA4aAAnSugtT2BI7HEqT1lLz0YF8NRDKL07TNbkmNLIHXBbXA5saf10N2juhflfIm5/b/W9lC3QsngMR27J25Ztqof6Ur36bIKJ6Y6XvYdlkkZkc8CgYEAxeCHUWMvtHtBID9ZOtrZRNhNJ/uz+2rzVSPd6ZdhEUWsvv/0p7JXmSAp2eoJDDKHeSnVxcxQMqhq0/edUSSzSvDpWha8UU4N8hRpu+M0XZNke0ijhpK6NIqNHPvZdsyFD0VR1Vaj2Ruy+pzih6PhqSnn2ZwvpQJAwBnqc2VCJJsCgYAkQr33hAbpxZ4EkmJw4elwye8L8x2a4rbH1TzQxBm8Lj3Nn26Qsve7gwbLkPULabWRirXzlrVkXfcuLNH1bc9Wl2vfGAYFdokjCYpGF4SxF+s47VlGnJc9tdT5UdvorjF0RaxwrRXtDi2b+Zsee8LKrU/sugzesQif3GZm30fKqwKBgQCQHwHP+HMFfAQqLZma8UzwBK7loUEsrHAAoff+K8CKKPoxvxD9lzqQD8oLqpbeaGsdh6fowe/jhaERM7dEI3vm6GK9t/N/MF+d4tpD+67nPPQhiv13haTTodo3swNnsHx1a+K3hLwf5DnOqLehXW59nET+zPAyudpZUEbft2+eYwKBgCMS6SitXwa2UjFNgkMAaOeJjkjnUKcr1tO/zPtaYPugKgkMQB890q4dcq5rnG2onhJ7hkoMwcrFugbD2nub9AIkaMc6Y46jyh2mSeA0337MpoMp99Jmp2/B1rouYo4IRS25b7jk22yjV8ARCzsxFVQxEwA1Lg8YpaXaifuI+/2O"},"public_keys":{"key_id_0":"CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQChp1HiZxTsLQCaHmW3/cc2ZDZpgLwn5o1/nZPgqT7SyXHP5bn7GQMG3kPEQWcl4nhtLX9hkrBEskHrdIlqp9zXFMwBfat+qfzCylGC/QBDF7wT9umLd7nbq7pAxQXteXgntt2Zhg4gE/kEk7vIyL+P9KpWJZ/yjpykgsDC7NPnrr8qZBo2tL0F4w+33nZhEx7Pp7Rnaq22JM8rF+NHCgSkUh63lp7Vhwm9PQoGtt0XTnEKxrMQnUme/IhGNxs84RphxHc5+nW6jYjgm5bcJonGyPU7bq+v51Mr2Ol4RT3L9ZNJgz0SWTSmAtiBLx2ryLrTjmDPSvN7wLm9sWEdWmRVAgMBAAE="}}
1+
{"private_keys":{"QmeL2mdVka1eahKENjehK6tBxkkpk5dNQ1qMcgWi7Hrb4B":"CAASqAkwggSkAgEAAoIBAQChp1HiZxTsLQCaHmW3/cc2ZDZpgLwn5o1/nZPgqT7SyXHP5bn7GQMG3kPEQWcl4nhtLX9hkrBEskHrdIlqp9zXFMwBfat+qfzCylGC/QBDF7wT9umLd7nbq7pAxQXteXgntt2Zhg4gE/kEk7vIyL+P9KpWJZ/yjpykgsDC7NPnrr8qZBo2tL0F4w+33nZhEx7Pp7Rnaq22JM8rF+NHCgSkUh63lp7Vhwm9PQoGtt0XTnEKxrMQnUme/IhGNxs84RphxHc5+nW6jYjgm5bcJonGyPU7bq+v51Mr2Ol4RT3L9ZNJgz0SWTSmAtiBLx2ryLrTjmDPSvN7wLm9sWEdWmRVAgMBAAECggEBAJMumrl+jWgz2TZ5sreBEp6NQ5VvpuDVY8PrnzaQIikdTMizK1BaB417VUwdGGM//dG5+R7HxkHl42sT4gH/8GzL/Krm1vwunXplZy3SWSi9NXsf9qgLTGebxasvOCRt0l6mesFLcxT12ma2c+VuEixp4aUqAKWB/1Ex03wm0RFBcSttPHe5ODW8Eaz+ZU8cpObEcZdCIPVxeWqLVdkAImOmsknL0EAxP8Wo/V6Rh5Cg4PnwnfJiQ45C+m6h7NTIw0H4UOncv7EBABra6LqF6Uoda9vmv8CpwaXwR557DPchQglFjtm48jWGeVKO3Zyutizu420eRrFZ0GmJo5flvkkCgYEA0SLysOZNxDgjYA0ihVYL6UbCvYUSADuDyTWREOUiRfmxAmS1xN9o7fieCJnA4aAAnSugtT2BI7HEqT1lLz0YF8NRDKL07TNbkmNLIHXBbXA5saf10N2juhflfIm5/b/W9lC3QsngMR27J25Ztqof6Ur36bIKJ6Y6XvYdlkkZkc8CgYEAxeCHUWMvtHtBID9ZOtrZRNhNJ/uz+2rzVSPd6ZdhEUWsvv/0p7JXmSAp2eoJDDKHeSnVxcxQMqhq0/edUSSzSvDpWha8UU4N8hRpu+M0XZNke0ijhpK6NIqNHPvZdsyFD0VR1Vaj2Ruy+pzih6PhqSnn2ZwvpQJAwBnqc2VCJJsCgYAkQr33hAbpxZ4EkmJw4elwye8L8x2a4rbH1TzQxBm8Lj3Nn26Qsve7gwbLkPULabWRirXzlrVkXfcuLNH1bc9Wl2vfGAYFdokjCYpGF4SxF+s47VlGnJc9tdT5UdvorjF0RaxwrRXtDi2b+Zsee8LKrU/sugzesQif3GZm30fKqwKBgQCQHwHP+HMFfAQqLZma8UzwBK7loUEsrHAAoff+K8CKKPoxvxD9lzqQD8oLqpbeaGsdh6fowe/jhaERM7dEI3vm6GK9t/N/MF+d4tpD+67nPPQhiv13haTTodo3swNnsHx1a+K3hLwf5DnOqLehXW59nET+zPAyudpZUEbft2+eYwKBgCMS6SitXwa2UjFNgkMAaOeJjkjnUKcr1tO/zPtaYPugKgkMQB890q4dcq5rnG2onhJ7hkoMwcrFugbD2nub9AIkaMc6Y46jyh2mSeA0337MpoMp99Jmp2/B1rouYo4IRS25b7jk22yjV8ARCzsxFVQxEwA1Lg8YpaXaifuI+/2O"},"public_keys":{"QmeL2mdVka1eahKENjehK6tBxkkpk5dNQ1qMcgWi7Hrb4B":"CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQChp1HiZxTsLQCaHmW3/cc2ZDZpgLwn5o1/nZPgqT7SyXHP5bn7GQMG3kPEQWcl4nhtLX9hkrBEskHrdIlqp9zXFMwBfat+qfzCylGC/QBDF7wT9umLd7nbq7pAxQXteXgntt2Zhg4gE/kEk7vIyL+P9KpWJZ/yjpykgsDC7NPnrr8qZBo2tL0F4w+33nZhEx7Pp7Rnaq22JM8rF+NHCgSkUh63lp7Vhwm9PQoGtt0XTnEKxrMQnUme/IhGNxs84RphxHc5+nW6jYjgm5bcJonGyPU7bq+v51Mr2Ol4RT3L9ZNJgz0SWTSmAtiBLx2ryLrTjmDPSvN7wLm9sWEdWmRVAgMBAAE="}}

auth/token/spec/token_store.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,15 +95,16 @@ func AssertTokenStoreSpec(t *testing.T, newTokenStore func(context.Context) toke
9595
expect := []token.RawToken{
9696
{
9797
Key: "_root",
98-
Raw: "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJRbVdZZ0Q0OXI5SG51WEVwcFFFcTFhN1NVVXJ5amE0UU5zOUU2WENIMlBheUNEIiwidXNlcm5hbWUiOiJsb2NhbF91c2VyIn0.hu1B92X8cLBRNtNNiwm_qn4T-s8WlDlsa0swNgeyUPJ921LfojmHobkuW4oRvNEjkq_OP2gkaZ_F0YyUgAM8K-pVg30L-jNG9cqA1EUx4cQ90ZSbMxvXzRmBevBa3Wq-RHErnGw-K7EvtZfuPrp60LuDBKkGCuAwfKV8D9O-6U4lrragFgfw3zWRdovnb28fO2W6sqP8azGDcY8klpysjx7W4V-qVynJ981_ex_G1wPbk1dov59MDlY6yoxt1rucyF5-f4oo9jv6k194Tigw3Uv6JR889kK5x87ruiApghfQIBosAd-hm79Xz0RmLahykoZZTbVASW6NcIPvqvZ5TA",
98+
Raw: "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJRbVdZZ0Q0OXI5SG51WEVwcFFFcTFhN1NVVXJ5amE0UU5zOUU2WENIMlBheUNEIiwicHJvZmlsZUlEIjoiUW1XWWdENDlyOUhudVhFcHBRRXExYTdTVVVyeWphNFFOczlFNlhDSDJQYXlDRCJ9.ZGWi-Ek60jlARIQFEBx0QnFpq0zrdlXKUOhdJtcyZohaKyeXF4lWnFVlnIFCSa-SKJFMnrdECygVFVAHOyj2wj-lXFSAsLIgZrLcS2kWp4alvc9K448PTy89zcdxPMhhwbR89cc7-5ndOjaxCL1JyiihmeIJbMAJ94z3QaFnhkWrcSUwxYalgYDdFaQChQRtSP454wtC2elXbDXSaJJpOgG0LU_tHun0lUgLHbYI4fG3Xoz-t9ZzuAXSgOKzduKVLRsSvoVmL81wXL2QRnMAnijovglBdkWxDmt7ae005ymd6wPMY-3Oy_2nmTbhSWrx-rcyA3Ce26gGKMEuP-EP8w",
9999
},
100100
{
101101
Key: secondKey,
102-
Raw: "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOi02MjEzNTU5NjgwMCwic3ViIjoiUW1QZUZUTkhjWkRyM1pGRWZGZmVweFM1UHFIQW1mQlJHUU5QSjM4OUN3aDFhcyIsInVzZXJuYW1lIjoidXNlcl8yIn0.WbQzurEYlJ6bdacO6vmcNgDWfrAvwiZXzmdtcRnFLdcAvWafgAEwbJBvqPGIbe_xujNVBExQ9JMu1-TuwhY3889bMuHtDJy7U9vQq9lAXUUNwEbN7I9sRoSfJV_zT6MIleSBUS48HqTrE0_w0Y3qcU53OpfZrOEa1axioKmdTQbsQCOj-J6l25KCSbIYaWju2kNGv3weTkQDbhUBoW_Z9pcuXuMNF6eQeZHNL1hIXz1sVQUE7aB-f_KDbK8XN_sZvNS4CiQfsIw9ig65YRs-mNF04VcDzAZFc-9FGeO0nnRjV9DVhocRCYq4rz4SsT1WFdUbI9lsEXd9t2wz6QUsIQ",
102+
Raw: "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOi02MjEzNTU5NjgwMCwic3ViIjoiUW1QZUZUTkhjWkRyM1pGRWZGZmVweFM1UHFIQW1mQlJHUU5QSjM4OUN3aDFhcyIsInByb2ZpbGVJRCI6IlFtUGVGVE5IY1pEcjNaRkVmRmZlcHhTNVBxSEFtZkJSR1FOUEozODlDd2gxYXMifQ.YakUofrw4mY5kEx8DB2CtBWBiXB6LdNfFd2uvYHRMm2jAS-3GOFy13hOHVhWKDidL4ve3n2bz1mMnSlHpf67gvep1cG8AsAfFaZEJdJPaeovkOvS21y_63o9BVNfpkRkh9QCd65QePHMJfyfwgUAZq2-vLTloiEjB0MX2oUmnF-bIWTUdJ9dsrS8MyzR4CcvPDx-J63n94w6MzK8ddVlUiFRFHx5jkuVfXLrSTaSvQPOq4SUj9sa8kmlk1pazIlTBIUH6raLoDZLxR6nY7Z8Uz-sS4P7bsRkv0647rPva8CmzdC-9SltNNfLC-pxFH1_sGO_fmr30fKyd2-YxOddaQ",
103103
},
104104
}
105105

106106
if diff := cmp.Diff(expect, results); diff != "" {
107+
t.Log(results)
107108
t.Errorf("mistmatched list keys results. (-want +got):\n%s", diff)
108109
}
109110

auth/token/token.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,6 @@ func ParseAuthToken(tokenString string, keystore key.Store) (*Token, error) {
100100
}
101101
pubKey := keystore.PubKey(pid)
102102
if pubKey == nil {
103-
for _, pid := range keystore.IDsWithKeys() {
104-
fmt.Printf("key %s has a pid\n", pid)
105-
}
106103
return nil, fmt.Errorf("cannot verify key. missing public key for id %s", claims.Issuer)
107104
}
108105
rawPubBytes, err := pubKey.Raw()

auth/token/token_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ func TestPrivKeyTokens(t *testing.T) {
3434
t.Fatal(err)
3535
}
3636

37-
expect := `eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJRbWVMMm1kVmthMWVhaEtFTmplaEs2dEJ4a2twazVkTlExcU1jZ1dpN0hyYjRCIiwidXNlcm5hbWUiOiJkb3VnIn0.ZNVGEvqDvCsY1H8dsWJILCIrcOTlLxC_5F-in7jWyfmT4RDatk3-ygVCCH-tYqvXx3dzf-U7qOSR8aR3E5Irvax84WoT0nwR7m51R36WaLPt_dXvtb4jLpjuqUdj5hGdBl2OA-UUuIlI7EzBftlNi6AMDQkcYbX8JWT-Jk47cVxM9f9DWDZphQlgEGm6Czdk5SCfIX1oORkN58zwIaOqP29aba6gzTgl3BMaTAJUkzy-i8dD98xLQXdXIYHxUzsLPAD-WjIEf7lmMetz2ls8okYq8EGyHVYhko_b6t8b5_VZA-GnFnB8D2JkAlcWEIJ_jxuNHHK7g0MTF1GPUT4s1A`
37+
expect := `eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJRbWVMMm1kVmthMWVhaEtFTmplaEs2dEJ4a2twazVkTlExcU1jZ1dpN0hyYjRCIiwicHJvZmlsZUlEIjoiUW1lTDJtZFZrYTFlYWhLRU5qZWhLNnRCeGtrcGs1ZE5RMXFNY2dXaTdIcmI0QiJ9.GG4qKXSUPCFS0a_xuU8NZcRyCPTKvZIObwZQY5bhwnS9hJaxekHOGfIrRsps2tMJJPK4dUSML7dkOs_norVcuhZ4fcmVcJDT_Jel-5DwgxojLS-7ci-tO7NyU1urv7TlfNCUBWiAIoUGj9mkXZYfxVNA0GSssBvKkK4gHbONqHyLc2afkox07-vVOXdwHtVMBMIN-sQGsMHuVze8UJPJRrL2LTRVaYKRaKYwLrt1IG2fFCIpt6xNG93DVkaFV8CezHHXp9rsGtx6FcZUxyONyhTNROQRcJ756DQDLcOup3w435oWzwdanQ-wqGAwhJuy49Pbf2s3ysujMxxITWya4g`
3838
if expect != tokenString {
3939
t.Errorf("token mismatch. expected: %q.\ngot: %q", expect, tokenString)
4040
}
4141

4242
tokenWithExpiryString, err := tokens.CreateToken(pro, time.Hour)
43-
expect = `eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOi02MjEzNTU5MzIwMCwic3ViIjoiUW1lTDJtZFZrYTFlYWhLRU5qZWhLNnRCeGtrcGs1ZE5RMXFNY2dXaTdIcmI0QiIsInVzZXJuYW1lIjoiZG91ZyJ9.d7XPhsj7hkyxg1JzC59hfu90RYem5q6Pie-ofJhdlGk_sY5bH8gcqG90LndMh4_LglEvtrwf_SVFcM1b78qhNon_Yo91kG_K_MmyExa-AlpY65Ji_kpRWcnI8hl-mxrZ2MzxPjvAEOa6c80DUWgTFKlkrgf9RnZlqq-nHnxHHXbVKYI3girsDgWynaIhR53yMBDIhbTCZaQ8XKtU_Pr0L1dJAW7YvOo2H01VM4LI_UQqhCmEbTnQX1Zee0tg88IMzLl7WsdNNOzUsf7dCYWGerLtzxGbxR0wweXbqVJBlzIl0Upke8-FBuZIbcdGSniy4DX643KrNnp_FnzQ8oBHTA`
43+
expect = `eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOi02MjEzNTU5MzIwMCwic3ViIjoiUW1lTDJtZFZrYTFlYWhLRU5qZWhLNnRCeGtrcGs1ZE5RMXFNY2dXaTdIcmI0QiIsInByb2ZpbGVJRCI6IlFtZUwybWRWa2ExZWFoS0VOamVoSzZ0Qnhra3BrNWROUTFxTWNnV2k3SHJiNEIifQ.JCiCgabd3cx8yoZcxD-N6ajyoLJ8wpZJjJ6EwWrP1QPvC9_CMRchxtMSLh0iudHLUIv8iFOykcjTCOtK2Mo9QlAF2k1EkV6Bvarxg-BaFhvU1cI1dll5tbDvDs5RVDWi7nSlGEe5nsQwjJXPVZjCKtVR2l-4_iI8FKDUdKI92TJUWiAJ7M1wuK4Do0mtkJxwzjCU_B_9Dxq4qvptAGTAydSQS6z3MPYOXa_I6x9MlRw6vVx6wMoU6Z3NH_pvctLVSvmDyZjst1kZxl__FBAqqjwRfjtijaO9dEDPcHbpN0f26e_MswOJDtPtD2_Yke5GpwfbeC-aUwaWtAvxnCnLqA`
4444
if expect != tokenWithExpiryString {
4545
t.Errorf("token mismatch. expected: %q.\ngot: %q", expect, tokenWithExpiryString)
4646
}

profile/store.go

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -308,12 +308,15 @@ func NewLocalStore(filename string, owner *Profile, ks key.Store) (Store, error)
308308
return nil, err
309309
}
310310

311-
return &LocalStore{
311+
s := &LocalStore{
312312
owner: owner,
313313
keyStore: ks,
314314
filename: filename,
315315
flock: flock.NewFlock(lockPath(filename)),
316-
}, nil
316+
}
317+
318+
err := s.PutProfile(owner)
319+
return s, err
317320
}
318321

319322
func lockPath(filename string) string {
@@ -448,10 +451,6 @@ func (r *LocalStore) GetProfile(id ID) (*Profile, error) {
448451
r.Lock()
449452
defer r.Unlock()
450453

451-
if id == r.owner.ID {
452-
return r.owner, nil
453-
}
454-
455454
ps, err := r.profiles()
456455
if err != nil {
457456
return nil, err
@@ -484,9 +483,6 @@ func (r *LocalStore) ProfilesForUsername(username string) ([]*Profile, error) {
484483
}
485484

486485
var res []*Profile
487-
if username == r.owner.Peername {
488-
res = append(res, r.owner)
489-
}
490486

491487
for id, p := range ps {
492488
if p.Peername == username {

profile/store_test.go

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package profile
22

33
import (
4+
"encoding/json"
45
"errors"
56
"io/ioutil"
67
"os"
@@ -45,7 +46,12 @@ func TestPutProfileWithAddresses(t *testing.T) {
4546
t.Fatal(err)
4647
}
4748

48-
ps, err := NewLocalStore(filepath.Join(path, "profiles.json"), &Profile{PrivKey: kd0.PrivKey, Peername: "user"}, ks)
49+
owner := &Profile{
50+
ID: ID(kd0.PeerID),
51+
Peername: "user",
52+
PrivKey: kd0.PrivKey,
53+
}
54+
ps, err := NewLocalStore(filepath.Join(path, "profiles.json"), owner, ks)
4955
if err != nil {
5056
t.Fatal(err)
5157
}
@@ -55,18 +61,28 @@ func TestPutProfileWithAddresses(t *testing.T) {
5561
t.Errorf("error putting profile: %s", err.Error())
5662
}
5763

58-
golden := "testdata/simple.json"
59-
path = filepath.Join(path, "profiles.json")
60-
f1, err := ioutil.ReadFile(golden)
64+
goldenFilepath := "testdata/simple.json"
65+
gf, err := ioutil.ReadFile(goldenFilepath)
6166
if err != nil {
6267
t.Errorf("error reading golden file: %s", err.Error())
6368
}
64-
f2, err := ioutil.ReadFile(path)
69+
golden := map[string]interface{}{}
70+
if err := json.Unmarshal(gf, &golden); err != nil {
71+
t.Fatal(err)
72+
}
73+
74+
path = filepath.Join(path, "profiles.json")
75+
f, err := ioutil.ReadFile(path)
6576
if err != nil {
6677
t.Errorf("error reading written file: %s", err.Error())
6778
}
79+
got := map[string]interface{}{}
80+
if err := json.Unmarshal(f, &got); err != nil {
81+
t.Fatal(err)
82+
}
6883

69-
if diff := cmp.Diff(f1, f2); diff != "" {
84+
t.Log(string(f))
85+
if diff := cmp.Diff(golden, got); diff != "" {
7086
t.Errorf("result mismatch (-want +got):\n%s", diff)
7187
}
7288
}
@@ -84,7 +100,12 @@ func TestProfilesWithKeys(t *testing.T) {
84100
t.Errorf("error creating tmp directory: %s", err.Error())
85101
}
86102

87-
ps, err := NewLocalStore(filepath.Join(path, "profiles.json"), &Profile{PrivKey: kd0.PrivKey, Peername: "user"}, ks)
103+
owner := &Profile{
104+
ID: ID(kd0.PeerID),
105+
Peername: "user",
106+
PrivKey: kd0.PrivKey,
107+
}
108+
ps, err := NewLocalStore(filepath.Join(path, "profiles.json"), owner, ks)
88109
if err != nil {
89110
t.Fatal(err)
90111
}

profile/testdata/simple.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"QmU27VdAEUL5NGM6oB56htTxvHLfcGZgsgxrJTdVr2k4zs":{"id":"QmU27VdAEUL5NGM6oB56htTxvHLfcGZgsgxrJTdVr2k4zs","peername":"test_peername","created":"2009-02-13T23:31:30Z","updated":"2009-02-13T23:31:30Z","type":"peer","email":"","name":"","description":"","homeurl":"","color":"","thumb":"","photo":"","poster":"","twitter":"","peerIDs":["/ipfs/Qmb9Gy14GuCjrhRSjGJQpf5JkgdEdbZrV81Tz4x3ZDreY3"]}}
1+
{"QmU27VdAEUL5NGM6oB56htTxvHLfcGZgsgxrJTdVr2k4zs":{"id":"QmU27VdAEUL5NGM6oB56htTxvHLfcGZgsgxrJTdVr2k4zs","peername":"test_peername","created":"2009-02-13T23:31:30Z","updated":"2009-02-13T23:31:30Z","type":"peer","email":"","name":"","description":"","homeurl":"","color":"","thumb":"","photo":"","poster":"","twitter":"","peerIDs":["/ipfs/Qmb9Gy14GuCjrhRSjGJQpf5JkgdEdbZrV81Tz4x3ZDreY3"]},"QmeL2mdVka1eahKENjehK6tBxkkpk5dNQ1qMcgWi7Hrb4B":{"id":"QmeL2mdVka1eahKENjehK6tBxkkpk5dNQ1qMcgWi7Hrb4B","privkey":"CAASqAkwggSkAgEAAoIBAQChp1HiZxTsLQCaHmW3/cc2ZDZpgLwn5o1/nZPgqT7SyXHP5bn7GQMG3kPEQWcl4nhtLX9hkrBEskHrdIlqp9zXFMwBfat+qfzCylGC/QBDF7wT9umLd7nbq7pAxQXteXgntt2Zhg4gE/kEk7vIyL+P9KpWJZ/yjpykgsDC7NPnrr8qZBo2tL0F4w+33nZhEx7Pp7Rnaq22JM8rF+NHCgSkUh63lp7Vhwm9PQoGtt0XTnEKxrMQnUme/IhGNxs84RphxHc5+nW6jYjgm5bcJonGyPU7bq+v51Mr2Ol4RT3L9ZNJgz0SWTSmAtiBLx2ryLrTjmDPSvN7wLm9sWEdWmRVAgMBAAECggEBAJMumrl+jWgz2TZ5sreBEp6NQ5VvpuDVY8PrnzaQIikdTMizK1BaB417VUwdGGM//dG5+R7HxkHl42sT4gH/8GzL/Krm1vwunXplZy3SWSi9NXsf9qgLTGebxasvOCRt0l6mesFLcxT12ma2c+VuEixp4aUqAKWB/1Ex03wm0RFBcSttPHe5ODW8Eaz+ZU8cpObEcZdCIPVxeWqLVdkAImOmsknL0EAxP8Wo/V6Rh5Cg4PnwnfJiQ45C+m6h7NTIw0H4UOncv7EBABra6LqF6Uoda9vmv8CpwaXwR557DPchQglFjtm48jWGeVKO3Zyutizu420eRrFZ0GmJo5flvkkCgYEA0SLysOZNxDgjYA0ihVYL6UbCvYUSADuDyTWREOUiRfmxAmS1xN9o7fieCJnA4aAAnSugtT2BI7HEqT1lLz0YF8NRDKL07TNbkmNLIHXBbXA5saf10N2juhflfIm5/b/W9lC3QsngMR27J25Ztqof6Ur36bIKJ6Y6XvYdlkkZkc8CgYEAxeCHUWMvtHtBID9ZOtrZRNhNJ/uz+2rzVSPd6ZdhEUWsvv/0p7JXmSAp2eoJDDKHeSnVxcxQMqhq0/edUSSzSvDpWha8UU4N8hRpu+M0XZNke0ijhpK6NIqNHPvZdsyFD0VR1Vaj2Ruy+pzih6PhqSnn2ZwvpQJAwBnqc2VCJJsCgYAkQr33hAbpxZ4EkmJw4elwye8L8x2a4rbH1TzQxBm8Lj3Nn26Qsve7gwbLkPULabWRirXzlrVkXfcuLNH1bc9Wl2vfGAYFdokjCYpGF4SxF+s47VlGnJc9tdT5UdvorjF0RaxwrRXtDi2b+Zsee8LKrU/sugzesQif3GZm30fKqwKBgQCQHwHP+HMFfAQqLZma8UzwBK7loUEsrHAAoff+K8CKKPoxvxD9lzqQD8oLqpbeaGsdh6fowe/jhaERM7dEI3vm6GK9t/N/MF+d4tpD+67nPPQhiv13haTTodo3swNnsHx1a+K3hLwf5DnOqLehXW59nET+zPAyudpZUEbft2+eYwKBgCMS6SitXwa2UjFNgkMAaOeJjkjnUKcr1tO/zPtaYPugKgkMQB890q4dcq5rnG2onhJ7hkoMwcrFugbD2nub9AIkaMc6Y46jyh2mSeA0337MpoMp99Jmp2/B1rouYo4IRS25b7jk22yjV8ARCzsxFVQxEwA1Lg8YpaXaifuI+/2O","peername":"user","created":"0001-01-01T00:00:00Z","updated":"0001-01-01T00:00:00Z","type":"peer","email":"","name":"","description":"","homeurl":"","color":"","thumb":"","photo":"","poster":"","twitter":""}}

0 commit comments

Comments
 (0)