int zmq::gssapi_client_t::process_handshake_command (msg_t *msg_) { if (state == recv_ready) { int rc = process_ready(msg_); if (rc == 0) state = send_ready; return rc; } if (state != recv_next_token) { errno = EPROTO; return -1; } if (process_next_token (msg_) < 0) return -1; if (maj_stat != GSS_S_COMPLETE && maj_stat != GSS_S_CONTINUE_NEEDED) return -1; state = call_next_init; errno_assert (msg_->close () == 0); errno_assert (msg_->init () == 0); return 0; }
int zmq::gssapi_server_t::process_handshake_command (msg_t *msg_) { if (state == recv_ready) { int rc = process_ready(msg_); if (rc == 0) state = connected; return rc; } if (state != recv_next_token) { errno = EPROTO; return -1; } if (security_context_established) { // Use ZAP protocol (RFC 27) to authenticate the user. // Note that rc will be -1 only if ZAP is not set up, but if it was // requested and it does not work properly the program will abort. bool expecting_zap_reply = false; int rc = session->zap_connect (); if (rc == 0) { rc = send_zap_request (); if (rc != 0) return -1; rc = receive_and_process_zap_reply (); if (rc != 0) { if (errno != EAGAIN) return -1; expecting_zap_reply = true; } } state = expecting_zap_reply? expect_zap_reply: send_ready; return 0; } if (process_next_token (msg_) < 0) return -1; accept_context (); state = send_next_token; errno_assert (msg_->close () == 0); errno_assert (msg_->init () == 0); return 0; }