diff options
author | Yonit Halperin <yhalperi@redhat.com> | 2011-09-18 15:17:33 +0300 |
---|---|---|
committer | Yonit Halperin <yhalperi@redhat.com> | 2011-09-26 12:17:58 +0300 |
commit | 59e55605cc0e0cef924a57a14325c3ca9fe2e110 (patch) | |
tree | cb15b51b0911c62626de5f01ffb4e2d2eec516b9 /client/red_peer.cpp | |
parent | fcb3b4ce5231218bcf949da4270bd85a2cfb3535 (diff) | |
download | spice-59e55605cc0e0cef924a57a14325c3ca9fe2e110.tar.gz spice-59e55605cc0e0cef924a57a14325c3ca9fe2e110.tar.xz spice-59e55605cc0e0cef924a57a14325c3ca9fe2e110.zip |
client: RedPeer::HostAuthOptions::set_cert_subject
Diffstat (limited to 'client/red_peer.cpp')
-rw-r--r-- | client/red_peer.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/client/red_peer.cpp b/client/red_peer.cpp index 61120b9e..0965ac3f 100644 --- a/client/red_peer.cpp +++ b/client/red_peer.cpp @@ -39,6 +39,57 @@ static void ssl_error() THROW_ERR(SPICEC_ERROR_CODE_SSL_ERROR, "SSL Error:", ERR_error_string(last_error, NULL)); } +bool RedPeer::HostAuthOptions::set_cert_subject(const char* subject) +{ + std::string subject_str(subject); + std::string::const_iterator iter = subject_str.begin(); + std::string entry; + this->type_flags = RedPeer::HostAuthOptions::HOST_AUTH_OP_SUBJECT; + this->host_subject.clear(); + + while (true) { + if ((iter == subject_str.end()) || (*iter == ',')) { + RedPeer::HostAuthOptions::CertFieldValuePair entry_pair; + int value_pos = entry.find_first_of('='); + if ((value_pos == std::string::npos) || (value_pos == (entry.length() - 1))) { + LOG_ERROR("host_subject bad format: assignment for %s is missing\n", entry.c_str()); + return false; + } + size_t start_pos = entry.find_first_not_of(' '); + if ((start_pos == std::string::npos) || (start_pos == value_pos)) { + LOG_ERROR("host_subject bad format: first part of assignment" + " must be non empty in %s\n", entry.c_str()); + return false; + } + entry_pair.first = entry.substr(start_pos, value_pos - start_pos); + entry_pair.second = entry.substr(value_pos + 1); + this->host_subject.push_back(entry_pair); + DBG(0, "subject entry: %s=%s", entry_pair.first.c_str(), entry_pair.second.c_str()); + if (iter == subject_str.end()) { + break; + } + entry.clear(); + } else if (*iter == '\\') { + iter++; + if (iter == subject_str.end()) { + LOG_WARN("single \\ in host subject"); + entry.append(1, '\\'); + continue; + } else if ((*iter == '\\') || (*iter == ',')) { + entry.append(1, *iter); + } else { + LOG_WARN("single \\ in host subject"); + entry.append(1, '\\'); + continue; + } + } else { + entry.append(1, *iter); + } + iter++; + } + return true; +} + RedPeer::RedPeer() : _peer (INVALID_SOCKET) , _shut (false) |