49 drizzle_return_t drizzle_handshake_server_read(drizzle_con_st *con)
60 drizzle_return_t drizzle_handshake_client_write(drizzle_con_st *con)
75 drizzle_return_t drizzle_handshake_server_write(drizzle_con_st *con)
86 drizzle_return_t drizzle_handshake_client_read(drizzle_con_st *con)
101 drizzle_return_t drizzle_state_handshake_server_read(drizzle_con_st *con)
105 unsigned char* packet_end;
109 return DRIZZLE_RETURN_INVALID_ARGUMENT;
114 if (con->buffer_size < con->packet_size)
117 return DRIZZLE_RETURN_OK;
120 if (con->packet_size < 46)
123 "bad packet size:>=46:%zu", con->packet_size);
124 return DRIZZLE_RETURN_BAD_HANDSHAKE_PACKET;
127 packet_end= con->buffer_ptr + con->packet_size;
128 con->protocol_version= con->buffer_ptr[0];
131 if (con->protocol_version != 10)
135 if (con->protocol_version == 255)
138 "%.*s", (int32_t)con->packet_size - 3,
139 con->buffer_ptr + 2);
140 return DRIZZLE_RETURN_AUTH_FAILED;
144 "protocol version not supported:%d",
145 con->protocol_version);
146 return DRIZZLE_RETURN_PROTOCOL_NOT_SUPPORTED;
150 ptr= (uint8_t*)memchr(con->buffer_ptr, 0, con->buffer_size - 1);
154 "server version string not found");
155 return DRIZZLE_RETURN_BAD_HANDSHAKE_PACKET;
158 if (con->packet_size < (46 + (
size_t)(ptr - con->buffer_ptr)))
161 "bad packet size:%zu:%zu",
162 (46 + (
size_t)(ptr - con->buffer_ptr)), con->packet_size);
163 return DRIZZLE_RETURN_BAD_HANDSHAKE_PACKET;
166 strncpy(con->server_version, (
char *)con->buffer_ptr,
167 DRIZZLE_MAX_SERVER_VERSION_SIZE);
168 con->server_version[DRIZZLE_MAX_SERVER_VERSION_SIZE - 1]= 0;
169 con->buffer_ptr+= ((ptr - con->buffer_ptr) + 1);
171 con->thread_id= (uint32_t)drizzle_get_byte4(con->buffer_ptr);
174 con->scramble= con->scramble_buffer;
175 memcpy(con->scramble, con->buffer_ptr, 8);
182 con->capabilities= (drizzle_capabilities_t)drizzle_get_byte2(con->buffer_ptr);
185 if (con->options & DRIZZLE_CON_MYSQL &&
186 !(con->capabilities & DRIZZLE_CAPABILITIES_PROTOCOL_41))
189 "protocol version not supported, must be MySQL 4.1+");
190 return DRIZZLE_RETURN_PROTOCOL_NOT_SUPPORTED;
193 con->charset= con->buffer_ptr[0];
196 con->status= drizzle_con_status_t(drizzle_get_byte2(con->buffer_ptr));
198 con->buffer_ptr+= 15;
200 memcpy(con->scramble + 8, con->buffer_ptr, 12);
201 con->buffer_ptr+= 13;
204 extra_length= packet_end - con->buffer_ptr;
205 assert(extra_length >= 0);
206 if (extra_length > DRIZZLE_MAX_SERVER_EXTRA_SIZE - 1)
207 extra_length= DRIZZLE_MAX_SERVER_EXTRA_SIZE - 1;
208 memcpy(con->server_extra, (
char *)con->buffer_ptr, extra_length);
209 con->server_extra[extra_length]= 0;
211 con->buffer_size-= con->packet_size;
212 if (con->buffer_size != 0)
215 "unexpected data after packet:%zu", con->buffer_size);
216 return DRIZZLE_RETURN_UNEXPECTED_DATA;
219 con->buffer_ptr= con->buffer;
223 if (!(con->options & DRIZZLE_CON_RAW_PACKET))
231 return DRIZZLE_RETURN_OK;
234 drizzle_return_t drizzle_state_handshake_server_write(drizzle_con_st *con)
240 return DRIZZLE_RETURN_INVALID_ARGUMENT;
246 + strlen(con->server_version) + 1
258 if ((con->packet_size + 4) > DRIZZLE_MAX_BUFFER_SIZE)
261 "buffer too small:%zu", con->packet_size + 4);
262 return DRIZZLE_RETURN_INTERNAL_ERROR;
265 ptr= con->buffer_ptr;
268 drizzle_set_byte3(ptr, con->packet_size);
270 con->packet_number= 1;
273 ptr[0]= con->protocol_version;
276 memcpy(ptr, con->server_version, strlen(con->server_version));
277 ptr+= strlen(con->server_version);
282 drizzle_set_byte4(ptr, con->thread_id);
285 if (con->scramble == NULL)
291 memcpy(ptr, con->scramble, 8);
298 if (con->options & DRIZZLE_CON_MYSQL)
299 con->capabilities|= DRIZZLE_CAPABILITIES_PROTOCOL_41;
302 drizzle_set_byte2(ptr, con->capabilities);
305 ptr[0]= con->charset;
308 drizzle_set_byte2(ptr, con->status);
314 if (con->scramble == NULL)
320 memcpy(ptr, con->scramble + 8, 12);
327 con->buffer_size+= (4 + con->packet_size);
330 if ((
size_t)(ptr - con->buffer_ptr) != (4 + con->packet_size))
333 "error packing server handshake:%zu:%zu",
334 (
size_t)(ptr - con->buffer_ptr), 4 + con->packet_size);
335 return DRIZZLE_RETURN_INTERNAL_ERROR;
339 return DRIZZLE_RETURN_OK;
342 drizzle_return_t drizzle_state_handshake_client_read(drizzle_con_st *con)
345 uint8_t scramble_size;
349 return DRIZZLE_RETURN_INVALID_ARGUMENT;
354 if (con->buffer_size < con->packet_size)
357 return DRIZZLE_RETURN_OK;
361 if (con->packet_size < 34)
364 "bad packet size:>=34:%zu", con->packet_size);
365 return DRIZZLE_RETURN_BAD_HANDSHAKE_PACKET;
370 con->capabilities= drizzle_get_byte4(con->buffer_ptr);
373 if (con->options & DRIZZLE_CON_MYSQL &&
374 !(con->capabilities & DRIZZLE_CAPABILITIES_PROTOCOL_41))
377 "protocol version not supported, must be MySQL 4.1+");
378 return DRIZZLE_RETURN_PROTOCOL_NOT_SUPPORTED;
381 con->max_packet_size= (uint32_t)drizzle_get_byte4(con->buffer_ptr);
384 con->charset= con->buffer_ptr[0];
388 con->buffer_ptr+= 23;
391 uint8_t *ptr= (uint8_t*)memchr(con->buffer_ptr, 0, con->buffer_size - 32);
395 "user string not found");
396 return DRIZZLE_RETURN_BAD_HANDSHAKE_PACKET;
399 if (con->buffer_ptr == ptr)
406 real_size+= (size_t)(ptr - con->buffer_ptr);
407 if (con->packet_size < real_size)
410 "bad packet size:>=%zu:%zu", real_size,
412 return DRIZZLE_RETURN_BAD_HANDSHAKE_PACKET;
415 strncpy(con->user, (
char *)con->buffer_ptr, DRIZZLE_MAX_USER_SIZE);
416 con->user[DRIZZLE_MAX_USER_SIZE - 1]= 0;
417 con->buffer_ptr+= ((ptr - con->buffer_ptr) + 1);
420 scramble_size= con->buffer_ptr[0];
423 if (scramble_size == 0)
429 if (scramble_size != DRIZZLE_MAX_SCRAMBLE_SIZE)
432 "wrong scramble size");
433 return DRIZZLE_RETURN_BAD_HANDSHAKE_PACKET;
436 real_size+= scramble_size;
437 con->scramble= con->scramble_buffer;
438 memcpy(con->scramble, con->buffer_ptr, DRIZZLE_MAX_SCRAMBLE_SIZE);
440 con->buffer_ptr+= DRIZZLE_MAX_SCRAMBLE_SIZE;
444 if ((34 + strlen(con->user) + scramble_size) == con->packet_size)
450 ptr= (uint8_t*)memchr(con->buffer_ptr, 0, con->buffer_size -
451 (34 + strlen(con->user) + scramble_size));
455 "db string not found");
456 return DRIZZLE_RETURN_BAD_HANDSHAKE_PACKET;
459 real_size+= ((size_t)(ptr - con->buffer_ptr) + 1);
460 if (con->packet_size != real_size)
463 "bad packet size:%zu:%zu", real_size, con->packet_size);
464 return DRIZZLE_RETURN_BAD_HANDSHAKE_PACKET;
467 if (con->buffer_ptr == ptr)
474 strncpy(con->db, (
char *)con->buffer_ptr, DRIZZLE_MAX_DB_SIZE);
475 con->db[DRIZZLE_MAX_DB_SIZE - 1]= 0;
476 con->buffer_ptr+= ((ptr - con->buffer_ptr) + 1);
480 con->buffer_size-= con->packet_size;
481 if (con->buffer_size != 0)
484 "unexpected data after packet:%zu", con->buffer_size);
485 return DRIZZLE_RETURN_UNEXPECTED_DATA;
488 con->buffer_ptr= con->buffer;
491 return DRIZZLE_RETURN_OK;
494 drizzle_return_t drizzle_state_handshake_client_write(drizzle_con_st *con)
498 drizzle_return_t ret;
502 return DRIZZLE_RETURN_INVALID_ARGUMENT;
511 + strlen(con->user) + 1
513 + DRIZZLE_MAX_SCRAMBLE_SIZE
514 + strlen(con->db) + 1;
517 if ((con->packet_size + 4) > DRIZZLE_MAX_BUFFER_SIZE)
520 "buffer too small:%zu", con->packet_size + 4);
521 return DRIZZLE_RETURN_INTERNAL_ERROR;
524 ptr= con->buffer_ptr;
527 ptr[3]= con->packet_number;
528 con->packet_number++;
531 if (con->options & DRIZZLE_CON_MYSQL)
532 con->capabilities|= DRIZZLE_CAPABILITIES_PROTOCOL_41;
534 capabilities= con->capabilities & int(DRIZZLE_CAPABILITIES_CLIENT);
535 if (!(con->options & DRIZZLE_CON_FOUND_ROWS))
536 capabilities&= ~int(DRIZZLE_CAPABILITIES_FOUND_ROWS);
538 if (con->options & DRIZZLE_CON_INTERACTIVE)
540 capabilities|= int(DRIZZLE_CAPABILITIES_INTERACTIVE);
543 if (con->options & DRIZZLE_CON_MULTI_STATEMENTS)
545 capabilities|= int(DRIZZLE_CAPABILITIES_MULTI_STATEMENTS);
548 if (con->options & DRIZZLE_CON_AUTH_PLUGIN)
550 capabilities|= int(DRIZZLE_CAPABILITIES_PLUGIN_AUTH);
553 capabilities&= ~(int(DRIZZLE_CAPABILITIES_COMPRESS) | int(DRIZZLE_CAPABILITIES_SSL));
555 capabilities&= ~int(DRIZZLE_CAPABILITIES_CONNECT_WITH_DB);
557 drizzle_set_byte4(ptr, capabilities);
560 drizzle_set_byte4(ptr, con->max_packet_size);
563 ptr[0]= con->charset;
570 if (ret != DRIZZLE_RETURN_OK)
573 con->buffer_size+= (4 + con->packet_size);
576 if ((
size_t)(ptr - con->buffer_ptr) != (4 + con->packet_size))
579 "error packing client handshake:%zu:%zu",
580 (
size_t)(ptr - con->buffer_ptr), 4 + con->packet_size);
581 return DRIZZLE_RETURN_INTERNAL_ERROR;
585 drizzle_set_byte3(con->buffer_ptr, con->packet_size);
588 return DRIZZLE_RETURN_OK;
591 drizzle_return_t drizzle_state_handshake_result_read(drizzle_con_st *con)
595 return DRIZZLE_RETURN_INVALID_ARGUMENT;
599 drizzle_result_st result;
600 if (drizzle_result_create(con, &result) == NULL)
602 return DRIZZLE_RETURN_MEMORY;
605 con->result= &result;
607 drizzle_return_t ret= drizzle_state_result_read(con);
610 if (ret == DRIZZLE_RETURN_OK)
612 if (drizzle_result_eof(&result))
615 "old insecure authentication mechanism not supported");
616 ret= DRIZZLE_RETURN_AUTH_FAILED;
620 con->options|= DRIZZLE_CON_READY;
625 drizzle_result_free(&result);
627 if (ret == DRIZZLE_RETURN_ERROR_CODE)
629 return DRIZZLE_RETURN_HANDSHAKE_FAILED;