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