mirror of https://github.com/docker/docs.git
Merge pull request #38 from docker/fixing-alias-panic
Fixed panic on listKeys with invalid keys, added tests Signed-off-by: David Lawrence <david.lawrence@docker.com> Signed-off-by: Diogo Mónica <diogo.monica@gmail.com> (github: endophage)
This commit is contained in:
commit
94b6269521
|
@ -212,14 +212,28 @@ func listKeys(s LimitedFileStore) map[string]string {
|
||||||
keyIDMap := make(map[string]string)
|
keyIDMap := make(map[string]string)
|
||||||
|
|
||||||
for _, f := range s.ListFiles() {
|
for _, f := range s.ListFiles() {
|
||||||
|
// Remove the prefix of the directory from the filename
|
||||||
if f[:len(rootKeysSubdir)] == rootKeysSubdir {
|
if f[:len(rootKeysSubdir)] == rootKeysSubdir {
|
||||||
f = strings.TrimPrefix(f, rootKeysSubdir+"/")
|
f = strings.TrimPrefix(f, rootKeysSubdir+"/")
|
||||||
} else {
|
} else {
|
||||||
f = strings.TrimPrefix(f, nonRootKeysSubdir+"/")
|
f = strings.TrimPrefix(f, nonRootKeysSubdir+"/")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Remove the extension from the full filename
|
||||||
|
// abcde_root.key becomes abcde_root
|
||||||
keyIDFull := strings.TrimSpace(strings.TrimSuffix(f, filepath.Ext(f)))
|
keyIDFull := strings.TrimSpace(strings.TrimSuffix(f, filepath.Ext(f)))
|
||||||
keyID := keyIDFull[:strings.LastIndex(keyIDFull, "_")]
|
|
||||||
keyAlias := keyIDFull[strings.LastIndex(keyIDFull, "_")+1:]
|
// If the key does not have a _, it is malformed
|
||||||
|
underscoreIndex := strings.LastIndex(keyIDFull, "_")
|
||||||
|
if underscoreIndex == -1 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// The keyID is the first part of the keyname
|
||||||
|
// The KeyAlias is the second part of the keyname
|
||||||
|
// in a key named abcde_root, abcde is the keyID and root is the KeyAlias
|
||||||
|
keyID := keyIDFull[:underscoreIndex]
|
||||||
|
keyAlias := keyIDFull[underscoreIndex+1:]
|
||||||
keyIDMap[keyID] = keyAlias
|
keyIDMap[keyID] = keyAlias
|
||||||
}
|
}
|
||||||
return keyIDMap
|
return keyIDMap
|
||||||
|
|
|
@ -114,6 +114,60 @@ EMl3eFOJXjIch/wIesRSN+2dGOsl7neercjMh1i9RvpCwHDx/E0=
|
||||||
assert.Equal(t, testData, pemPrivKey)
|
assert.Equal(t, testData, pemPrivKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestListKeys(t *testing.T) {
|
||||||
|
testName := "docker.com/notary/root"
|
||||||
|
perms := os.FileMode(0755)
|
||||||
|
|
||||||
|
// Temporary directory where test files will be created
|
||||||
|
tempBaseDir, err := ioutil.TempDir("", "notary-test-")
|
||||||
|
assert.NoError(t, err, "failed to create a temporary directory")
|
||||||
|
defer os.RemoveAll(tempBaseDir)
|
||||||
|
|
||||||
|
// Create our store
|
||||||
|
store, err := NewKeyFileStore(tempBaseDir, passphraseRetriever)
|
||||||
|
assert.NoError(t, err, "failed to create new key filestore")
|
||||||
|
|
||||||
|
privKey, err := GenerateECDSAKey(rand.Reader)
|
||||||
|
assert.NoError(t, err, "could not generate private key")
|
||||||
|
|
||||||
|
// Call the AddKey function
|
||||||
|
err = store.AddKey(testName, "root", privKey)
|
||||||
|
assert.NoError(t, err, "failed to add key to store")
|
||||||
|
|
||||||
|
// Check to see if the keystore lists this key
|
||||||
|
keyMap := store.ListKeys()
|
||||||
|
|
||||||
|
// Expect to see exactly one key in the map
|
||||||
|
assert.Len(t, keyMap, 1)
|
||||||
|
// Expect to see privKeyID inside of the map
|
||||||
|
role, ok := keyMap[testName]
|
||||||
|
assert.True(t, ok)
|
||||||
|
assert.Equal(t, role, "root")
|
||||||
|
|
||||||
|
// Call the AddKey function for the second key
|
||||||
|
err = store.AddKey(testName+"2", "targets", privKey)
|
||||||
|
assert.NoError(t, err, "failed to add key to store")
|
||||||
|
|
||||||
|
// Check to see if the keystore lists this key
|
||||||
|
keyMap = store.ListKeys()
|
||||||
|
|
||||||
|
// Expect to see exactly two keys in the map
|
||||||
|
assert.Len(t, keyMap, 2)
|
||||||
|
// Expect to see privKeyID2 inside of the map
|
||||||
|
role, ok = keyMap[testName+"2"]
|
||||||
|
assert.True(t, ok)
|
||||||
|
assert.Equal(t, role, "targets")
|
||||||
|
|
||||||
|
// Write an invalid filename to the directory
|
||||||
|
filePath := filepath.Join(tempBaseDir, rootKeysSubdir, "fakekeyname.key")
|
||||||
|
err = ioutil.WriteFile(filePath, []byte("data"), perms)
|
||||||
|
assert.NoError(t, err, "failed to write test file")
|
||||||
|
|
||||||
|
// Check to see if the keystore still lists two keys
|
||||||
|
keyMap = store.ListKeys()
|
||||||
|
assert.Len(t, keyMap, 2)
|
||||||
|
}
|
||||||
|
|
||||||
func TestAddGetKeyMemStore(t *testing.T) {
|
func TestAddGetKeyMemStore(t *testing.T) {
|
||||||
testName := "docker.com/notary/root"
|
testName := "docker.com/notary/root"
|
||||||
testAlias := "root"
|
testAlias := "root"
|
||||||
|
@ -136,6 +190,7 @@ func TestAddGetKeyMemStore(t *testing.T) {
|
||||||
assert.Equal(t, retrievedKey.Public(), privKey.Public())
|
assert.Equal(t, retrievedKey.Public(), privKey.Public())
|
||||||
assert.Equal(t, retrievedKey.Private(), privKey.Private())
|
assert.Equal(t, retrievedKey.Private(), privKey.Private())
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetDecryptedWithTamperedCipherText(t *testing.T) {
|
func TestGetDecryptedWithTamperedCipherText(t *testing.T) {
|
||||||
testExt := "key"
|
testExt := "key"
|
||||||
testAlias := "root"
|
testAlias := "root"
|
||||||
|
|
Loading…
Reference in New Issue