Skip to content
This repository was archived by the owner on Aug 1, 2023. It is now read-only.

Commit c3d49b7

Browse files
Added test for servers.GetPasswordResult and fixed spelling.
1 parent 5b8bbff commit c3d49b7

File tree

2 files changed

+98
-1
lines changed

2 files changed

+98
-1
lines changed

openstack/compute/v2/servers/requests.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -862,7 +862,7 @@ func IDFromName(client *gophercloud.ServiceClient, name string) (string, error)
862862
}
863863
}
864864

865-
// GetPassword makes a request agains the nova API to get the encrypted administrative password.
865+
// GetPassword makes a request against the nova API to get the encrypted administrative password.
866866
func GetPassword(client *gophercloud.ServiceClient, serverId string) GetPasswordResult {
867867
var res GetPasswordResult
868868
_, res.Err = client.Request("GET", passwordURL(client, serverId), gophercloud.RequestOpts{
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package servers
2+
3+
import (
4+
"crypto/rsa"
5+
"encoding/json"
6+
"fmt"
7+
"testing"
8+
9+
"github.com/rackspace/gophercloud"
10+
th "github.com/rackspace/gophercloud/testhelper"
11+
"golang.org/x/crypto/ssh"
12+
)
13+
14+
// Fail - No password in JSON.
15+
func TestExtractPassword_no_pwd_data(t *testing.T) {
16+
17+
var dejson interface{}
18+
err := json.Unmarshal([]byte(`{ "Crappy data": ".-.-." }`), &dejson)
19+
if err != nil {
20+
t.Fatalf("%s", err)
21+
}
22+
resp := GetPasswordResult{gophercloud.Result{Body: dejson}}
23+
24+
pwd, err := resp.ExtractPassword(nil)
25+
th.AssertEquals(t, pwd, "")
26+
}
27+
28+
// Ok - return encrypted password when no private key is given.
29+
func TestExtractPassword_encrypted_pwd(t *testing.T) {
30+
31+
var dejson interface{}
32+
sejson := []byte(`{"password":"PP8EnwPO9DhEc8+O/6CKAkPF379mKsUsfFY6yyw0734XXvKsSdV9KbiHQ2hrBvzeZxtGMrlFaikVunCRizyLLWLMuOi4hoH+qy9F9sQid61gQIGkxwDAt85d/7Eau2/KzorFnZhgxArl7IiqJ67X6xjKkR3zur+Yp3V/mtVIehpPYIaAvPbcp2t4mQXl1I9J8yrQfEZOctLL1L4heDEVXnxvNihVLK6pivlVggp6SZCtjj9cduZGrYGsxsOCso1dqJQr7GCojfwvuLOoG0OYwEGuWVTZppxWxi/q1QgeHFhGKA5QUXlz7pS71oqpjYsTeViuHnfvlqb5TVYZpQ1haw=="}`)
33+
34+
err := json.Unmarshal(sejson, &dejson)
35+
fmt.Printf("%v\n", dejson)
36+
if err != nil {
37+
t.Fatalf("%s", err)
38+
}
39+
resp := GetPasswordResult{gophercloud.Result{Body: dejson}}
40+
41+
pwd, err := resp.ExtractPassword(nil)
42+
th.AssertNoErr(t, err)
43+
th.AssertEquals(t, "PP8EnwPO9DhEc8+O/6CKAkPF379mKsUsfFY6yyw0734XXvKsSdV9KbiHQ2hrBvzeZxtGMrlFaikVunCRizyLLWLMuOi4hoH+qy9F9sQid61gQIGkxwDAt85d/7Eau2/KzorFnZhgxArl7IiqJ67X6xjKkR3zur+Yp3V/mtVIehpPYIaAvPbcp2t4mQXl1I9J8yrQfEZOctLL1L4heDEVXnxvNihVLK6pivlVggp6SZCtjj9cduZGrYGsxsOCso1dqJQr7GCojfwvuLOoG0OYwEGuWVTZppxWxi/q1QgeHFhGKA5QUXlz7pS71oqpjYsTeViuHnfvlqb5TVYZpQ1haw==", pwd)
44+
}
45+
46+
// Ok - return decrypted password when private key is given.
47+
// Decrytion can be verified by:
48+
// echo "<enc_pwd>" | base64 -D | openssl rsautl -decrypt -inkey <privateKey.pem>
49+
func TestExtractPassword_decrypted_pwd(t *testing.T) {
50+
51+
privateKey, err := ssh.ParseRawPrivateKey([]byte(`
52+
-----BEGIN RSA PRIVATE KEY-----
53+
MIIEpQIBAAKCAQEAo1ODZgwMVdTJYim9UYuYhowoPMhGEuV5IRZjcJ315r7RBSC+
54+
yEiBb1V+jhf+P8fzAyU35lkBzZGDr7E3jxSesbOuYT8cItQS4ErUnI1LGuqvMxwv
55+
X3GMyE/HmOcaiODF1XZN3Ur5pMJdVknnmczgUsW0hT98Udrh3MQn9WSuh/6LRy6+
56+
x1QsKHOCLFPnkhWa3LKyxmpQq/Gvhz+6NLe+gt8MFullA5mKQxBJ/K6laVHeaMlw
57+
JG3GCX0EZhRlvzoV8koIBKZtbKFolFr8ZtxBm3R5LvnyrtOvp22sa+xeItUT5kG1
58+
ZnbGNdK87oYW+VigEUfzT/+8R1i6E2QIXoeZiQIDAQABAoIBAQCVZ70IqbbTAW8j
59+
RAlyQh/J3Qal65LmkFJJKUDX8TfT1/Q/G6BKeMEmxm+Zrmsfj1pHI1HKftt+YEG1
60+
g4jOc09kQXkgbmnfll6aHPn3J+1vdwXD3GGdjrL5PrnYrngAhJWU2r8J0x8hT8ew
61+
OrUJZXhDX6XuSpAAFRmOKUZgXbSmo4X+LZX76ACnarselJt5FL724ECvpWJ7xxC4
62+
FMzvp4RqMmNFvv/Uq9lE/EmoSk4dviYyIZZ16DbDNyc9k/sGqCAMktCEwZ3EQm//
63+
S5bkNhgP6oUXjluWy53aPRgykEylgDWo5SSdSEyKnw/fciU0xdprA9JrBGIcTyHS
64+
/k2kgD4xAoGBANTkJ88Q0YrxX3fZNZVqcn00XKTxPGmxN5LRs7eV743q30AxK5Db
65+
QU8iwaAA1IKUWV5DLhgUTNsDCOPUPue4aOSBD3/sj+WEmvIhj7afDL5didkYHsqf
66+
fDnhFHq7y/3i57d428C7BwwR79pGWVyi7vH3pfu9A1iwl1aNOae+zvbVAoGBAMRm
67+
AmwQ9fJ3Qc44jysFK/yliLRGdShjkMMah5G3JlrelwfPtwPwEL2EHHhJB/C1acMs
68+
n6Q6RaoF6WNSZUY65ksQg7aPOYf2X0FTFwQJvwDJ4qlWjmq7w+tQ0AoGJG+dVUmQ
69+
zHZ/Y+HokSXzz9c4oevk4v/rMgAQ00WHrTdtIhnlAoGBALIJJ72D7CkNGHCq5qPQ
70+
xHQukPejgolFGhufYXM7YX3GmPMe67cVlTVv9Isxhoa5N0+cUPT0LR3PGOUm/4Bb
71+
eOT3hZXOqLwhvE6XgI8Rzd95bClwgXekDoh80dqeKMdmta961BQGlKskaPiacmsF
72+
G1yhZV70P9Mwwy8vpbLB4GUNAoGAbTwbjsWkNfa0qCF3J8NZoszjCvnBQfSW2J1R
73+
1+8ZKyNwt0yFi3Ajr3TibNiZzPzp1T9lj29FvfpJxA9Y+sXZvthxmcFxizix5GB1
74+
ha5yCNtA8VSOI7lJkAFDpL+j1lyYyjD6N9JE2KqEyKoh6J+8F7sXsqW7CqRRDfQX
75+
mKNfey0CgYEAxcEoNoADN2hRl7qY9rbQfVvQb3RkoQkdHhl9gpLFCcV32IP8R4xg
76+
09NbQK5OmgcIuZhLVNzTmUHJbabEGeXqIFIV0DsqECAt3WzbDyKQO23VJysFD46c
77+
KSde3I0ybDz7iS2EtceKB7m4C0slYd+oBkm4efuF00rCOKDwpFq45m0=
78+
-----END RSA PRIVATE KEY-----
79+
`))
80+
if err != nil {
81+
t.Fatalf("Error parsing private key: %s\n", err)
82+
}
83+
84+
var dejson interface{}
85+
sejson := []byte(`{"password":"PP8EnwPO9DhEc8+O/6CKAkPF379mKsUsfFY6yyw0734XXvKsSdV9KbiHQ2hrBvzeZxtGMrlFaikVunCRizyLLWLMuOi4hoH+qy9F9sQid61gQIGkxwDAt85d/7Eau2/KzorFnZhgxArl7IiqJ67X6xjKkR3zur+Yp3V/mtVIehpPYIaAvPbcp2t4mQXl1I9J8yrQfEZOctLL1L4heDEVXnxvNihVLK6pivlVggp6SZCtjj9cduZGrYGsxsOCso1dqJQr7GCojfwvuLOoG0OYwEGuWVTZppxWxi/q1QgeHFhGKA5QUXlz7pS71oqpjYsTeViuHnfvlqb5TVYZpQ1haw=="}`)
86+
87+
err = json.Unmarshal(sejson, &dejson)
88+
fmt.Printf("%v\n", dejson)
89+
if err != nil {
90+
t.Fatalf("%s", err)
91+
}
92+
resp := GetPasswordResult{gophercloud.Result{Body: dejson}}
93+
94+
pwd, err := resp.ExtractPassword(privateKey.(*rsa.PrivateKey))
95+
th.AssertNoErr(t, err)
96+
th.AssertEquals(t, "ruZKK0tqxRfYm5t7lSJq", pwd)
97+
}

0 commit comments

Comments
 (0)