summaryrefslogtreecommitdiffstats
path: root/client/red_peer.cpp
diff options
context:
space:
mode:
authorYonit Halperin <yhalperi@redhat.com>2011-09-18 15:17:33 +0300
committerYonit Halperin <yhalperi@redhat.com>2011-09-26 12:17:58 +0300
commit59e55605cc0e0cef924a57a14325c3ca9fe2e110 (patch)
treecb15b51b0911c62626de5f01ffb4e2d2eec516b9 /client/red_peer.cpp
parentfcb3b4ce5231218bcf949da4270bd85a2cfb3535 (diff)
downloadspice-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.cpp51
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)