31 #include "platform.hpp" 32 #ifdef ZMQ_HAVE_WINDOWS 45 const std::string &peer_address_,
49 peer_address (peer_address_),
50 state (waiting_for_hello)
98 puts (
"PLAIN I: invalid handshake command");
139 const unsigned char *ptr = static_cast <
unsigned char *> (msg_->
data ());
140 size_t bytes_left = msg_->
size ();
142 if (bytes_left < 6 || memcmp (ptr,
"\x05HELLO", 6)) {
144 puts (
"PLAIN I: invalid PLAIN client, did not send HELLO");
151 if (bytes_left < 1) {
153 puts (
"PLAIN I: invalid PLAIN client, did not send username");
157 const size_t username_length = static_cast <
size_t> (*ptr++);
160 if (bytes_left < username_length) {
162 puts (
"PLAIN I: invalid PLAIN client, sent malformed username");
166 const std::string username = std::string ((
char *) ptr, username_length);
167 ptr += username_length;
168 bytes_left -= username_length;
169 if (bytes_left < 1) {
171 puts (
"PLAIN I: invalid PLAIN client, did not send password");
176 const size_t password_length = static_cast <
size_t> (*ptr++);
178 if (bytes_left < password_length) {
180 puts (
"PLAIN I: invalid PLAIN client, sent malformed password");
185 const std::string password = std::string ((
char *) ptr, password_length);
186 ptr += password_length;
187 bytes_left -= password_length;
188 if (bytes_left > 0) {
190 puts (
"PLAIN I: invalid PLAIN client, sent extraneous data");
220 memcpy (msg_->
data (),
"\x07WELCOME", 8);
226 const unsigned char *ptr = static_cast <
unsigned char *> (msg_->
data ());
227 const size_t bytes_left = msg_->
size ();
229 if (bytes_left < 9 || memcmp (ptr,
"\x08INITIATE", 9)) {
231 puts (
"PLAIN I: invalid PLAIN client, did not send INITIATE");
243 unsigned char *
const command_buffer = (
unsigned char *) malloc (512);
246 unsigned char *ptr = command_buffer;
249 memcpy (ptr,
"\x05READY", 6);
254 ptr +=
add_property (ptr,
"Socket-Type", socket_type, strlen (socket_type));
263 const size_t command_size = ptr - command_buffer;
264 const int rc = msg_->
init_size (command_size);
266 memcpy (msg_->
data (), command_buffer, command_size);
267 free (command_buffer);
277 char *msg_data = static_cast <
char *> (msg_->
data ());
278 memcpy (msg_data,
"\5ERROR", 6);
285 const std::string &password)
300 memcpy (msg.
data (),
"1.0", 3);
308 memcpy (msg.
data (),
"1", 1);
340 memcpy (msg.
data (),
"PLAIN", 5);
348 memcpy (msg.
data (), username.c_str (), username.length ());
356 memcpy (msg.
data (), password.c_str (), password.length ());
367 for (
int i = 0; i < 7; i++) {
368 rc = msg [i].
init ();
372 for (
int i = 0; i < 7; i++) {
378 puts (
"PLAIN I: ZAP handler sent incomplete reply message");
389 if (msg [0].
size () > 0) {
391 puts (
"PLAIN I: ZAP handler sent malformed reply message");
398 if (msg [1].
size () != 3 || memcmp (msg [1].data (),
"1.0", 3)) {
400 puts (
"PLAIN I: ZAP handler sent bad version number");
407 if (msg [2].
size () != 1 || memcmp (msg [2].data (),
"1", 1)) {
409 puts (
"PLAIN I: ZAP handler sent bad request ID");
416 if (msg [3].
size () != 3) {
418 puts (
"PLAIN I: ZAP handler rejected client authentication");
425 status_code.assign (static_cast <char *> (msg [3].data ()), 3);
431 rc =
parse_metadata (static_cast <const unsigned char*> (msg [6].data ()),
432 msg [6].
size (),
true);
435 for (
int i = 0; i < 7; i++) {
436 const int rc2 = msg [i].
close ();
int produce_error(msg_t *msg_) const
int process_initiate(msg_t *msg_)
virtual int zap_msg_available()
virtual status_t status() const
int receive_and_process_zap_reply()
int write_zap_msg(msg_t *msg_)
int init_size(size_t size_)
virtual int next_handshake_command(msg_t *msg_)
int produce_welcome(msg_t *msg_) const
const std::string peer_address
void send_zap_request(const std::string &username, const std::string &password)
int parse_metadata(const unsigned char *ptr_, size_t length, bool zap_flag=false)
unsigned char identity[256]
int read_zap_msg(msg_t *msg_)
const char * socket_type_string(int socket_type) const
void set_flags(unsigned char flags_)
virtual int process_handshake_command(msg_t *msg_)
session_base_t *const session
int produce_ready(msg_t *msg_) const
unsigned char data[max_vsm_size]
plain_server_t(session_base_t *session_, const std::string &peer_address_, const options_t &options_)
virtual ~plain_server_t()
int process_hello(msg_t *msg_)
size_t add_property(unsigned char *ptr, const char *name, const void *value, size_t value_len) const
unsigned char identity_size
void set_user_id(const void *user_id, size_t size)