mirror of
https://github.com/zeromq/libzmq.git
synced 2025-03-09 15:26:04 +00:00
Updated ZAP request for changed protocol draft
- username and password sent as two string frames - fixed test case to match
This commit is contained in:
parent
656ff5b208
commit
6ff51ee909
@ -262,15 +262,18 @@ int zmq::plain_mechanism_t::process_hello_command (msg_t *msg_)
|
|||||||
rc = session->write_zap_msg (&msg);
|
rc = session->write_zap_msg (&msg);
|
||||||
errno_assert (rc == 0);
|
errno_assert (rc == 0);
|
||||||
|
|
||||||
// Credentials frame
|
// Username frame
|
||||||
rc = msg.init_size (1 + username_length + 1 + password_length);
|
rc = msg.init_size (username_length);
|
||||||
errno_assert (rc == 0);
|
errno_assert (rc == 0);
|
||||||
char *data_ptr = static_cast <char *> (msg.data ());
|
memcpy (msg.data (), username.c_str (), username_length);
|
||||||
*data_ptr++ = static_cast <unsigned char> (username_length);
|
msg.set_flags (msg_t::more);
|
||||||
memcpy (data_ptr, username.c_str (), username_length);
|
rc = session->write_zap_msg (&msg);
|
||||||
data_ptr += username_length;
|
errno_assert (rc == 0);
|
||||||
*data_ptr++ = static_cast <unsigned char> (password_length);
|
|
||||||
memcpy (data_ptr, password.c_str (), password_length);
|
// Password frame
|
||||||
|
rc = msg.init_size (password_length);
|
||||||
|
errno_assert (rc == 0);
|
||||||
|
memcpy (msg.data (), password.c_str (), password_length);
|
||||||
rc = session->write_zap_msg (&msg);
|
rc = session->write_zap_msg (&msg);
|
||||||
errno_assert (rc == 0);
|
errno_assert (rc == 0);
|
||||||
|
|
||||||
|
@ -21,33 +21,12 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "testutil.hpp"
|
#include "testutil.hpp"
|
||||||
|
|
||||||
static bool
|
|
||||||
authenticate (const unsigned char *data, size_t data_length)
|
|
||||||
{
|
|
||||||
const char *username = "admin";
|
|
||||||
const size_t username_length = strlen (username);
|
|
||||||
const char *password = "password";
|
|
||||||
const size_t password_length = strlen (password);
|
|
||||||
|
|
||||||
if (data_length != 1 + username_length + 1 + password_length)
|
|
||||||
return false;
|
|
||||||
if (data [0] != username_length)
|
|
||||||
return false;
|
|
||||||
if (memcmp (data + 1, username, username_length))
|
|
||||||
return false;
|
|
||||||
if (data [1 + username_length] != password_length)
|
|
||||||
return false;
|
|
||||||
if (memcmp (data + 1 + username_length + 1, password, password_length))
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
zap_handler (void *zap)
|
zap_handler (void *zap)
|
||||||
{
|
{
|
||||||
int rc, more;
|
int rc, more;
|
||||||
size_t optlen;
|
size_t optlen;
|
||||||
zmq_msg_t version, seqno, domain, mechanism, credentials;
|
zmq_msg_t version, seqno, domain, mechanism, username, password;
|
||||||
zmq_msg_t status_code, status_text, user_id;
|
zmq_msg_t status_code, status_text, user_id;
|
||||||
|
|
||||||
// Version
|
// Version
|
||||||
@ -86,17 +65,24 @@ zap_handler (void *zap)
|
|||||||
rc = zmq_getsockopt (zap, ZMQ_RCVMORE, &more, &optlen);
|
rc = zmq_getsockopt (zap, ZMQ_RCVMORE, &more, &optlen);
|
||||||
assert (rc == 0 && more == 1);
|
assert (rc == 0 && more == 1);
|
||||||
|
|
||||||
// Credentials
|
// Username
|
||||||
rc = zmq_msg_init (&credentials);
|
rc = zmq_msg_init (&username);
|
||||||
assert (rc == 0);
|
assert (rc == 0);
|
||||||
rc = zmq_msg_recv (&credentials, zap, 0);
|
rc = zmq_msg_recv (&username, zap, 0);
|
||||||
|
bool username_ok = (rc == 5 && memcmp (zmq_msg_data (&username), "admin", 5) == 0);
|
||||||
|
optlen = sizeof more;
|
||||||
|
rc = zmq_getsockopt (zap, ZMQ_RCVMORE, &more, &optlen);
|
||||||
|
assert (rc == 0 && more == 1);
|
||||||
|
|
||||||
|
// Password
|
||||||
|
rc = zmq_msg_init (&password);
|
||||||
|
assert (rc == 0);
|
||||||
|
rc = zmq_msg_recv (&password, zap, 0);
|
||||||
optlen = sizeof more;
|
optlen = sizeof more;
|
||||||
rc = zmq_getsockopt (zap, ZMQ_RCVMORE, &more, &optlen);
|
rc = zmq_getsockopt (zap, ZMQ_RCVMORE, &more, &optlen);
|
||||||
assert (rc == 0 && more == 0);
|
assert (rc == 0 && more == 0);
|
||||||
|
|
||||||
const bool auth_ok =
|
bool password_ok = (rc == 8 && memcmp (zmq_msg_data (&password), "password", 8) == 0);
|
||||||
authenticate ((unsigned char *) zmq_msg_data (&credentials),
|
|
||||||
zmq_msg_size (&credentials));
|
|
||||||
|
|
||||||
rc = zmq_msg_send (&version, zap, ZMQ_SNDMORE);
|
rc = zmq_msg_send (&version, zap, ZMQ_SNDMORE);
|
||||||
assert (rc == 3);
|
assert (rc == 3);
|
||||||
@ -106,7 +92,7 @@ zap_handler (void *zap)
|
|||||||
|
|
||||||
rc = zmq_msg_init_size (&status_code, 3);
|
rc = zmq_msg_init_size (&status_code, 3);
|
||||||
assert (rc == 0);
|
assert (rc == 0);
|
||||||
memcpy (zmq_msg_data (&status_code), auth_ok? "200": "400", 3);
|
memcpy (zmq_msg_data (&status_code), username_ok && password_ok? "200": "400", 3);
|
||||||
rc = zmq_msg_send (&status_code, zap, ZMQ_SNDMORE);
|
rc = zmq_msg_send (&status_code, zap, ZMQ_SNDMORE);
|
||||||
assert (rc == 3);
|
assert (rc == 3);
|
||||||
|
|
||||||
@ -126,7 +112,10 @@ zap_handler (void *zap)
|
|||||||
rc = zmq_msg_close (&mechanism);
|
rc = zmq_msg_close (&mechanism);
|
||||||
assert (rc == 0);
|
assert (rc == 0);
|
||||||
|
|
||||||
rc = zmq_msg_close (&credentials);
|
rc = zmq_msg_close (&username);
|
||||||
|
assert (rc == 0);
|
||||||
|
|
||||||
|
rc = zmq_msg_close (&password);
|
||||||
assert (rc == 0);
|
assert (rc == 0);
|
||||||
|
|
||||||
rc = zmq_close (zap);
|
rc = zmq_close (zap);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user