Rickard von Essen | ab8cd7a | 2016-02-17 20:25:39 +0100 | [diff] [blame^] | 1 | // +build fixtures |
| 2 | |
Rickard von Essen | c3d49b7 | 2016-02-16 20:59:18 +0100 | [diff] [blame] | 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 | } |