diff --git a/include/MySQL_Protocol.h b/include/MySQL_Protocol.h index 2574180af..2481b9af1 100644 --- a/include/MySQL_Protocol.h +++ b/include/MySQL_Protocol.h @@ -65,22 +65,11 @@ class MySQL_Protocol { // - a pointer to void pointer, used to return the packet if not NULL // - a pointer to unsigned int, used to return the size of the packet if not NULL // for now, they all return true -// bool generate_pkt_OK(MySQL_Data_Stream *myds, bool send, void **ptr, unsigned int *len, uint8_t sequence_id, unsigned int affected_rows, unsigned int last_insert_id, uint16_t status, uint16_t warnings, char *msg); -// bool generate_pkt_ERR(MySQL_Data_Stream *myds, bool send, void **ptr, unsigned int *len, uint8_t sequence_id, uint16_t error_code, char *sql_state, char *sql_message); -// bool generate_pkt_EOF(MySQL_Data_Stream *myds, bool send, void **ptr, unsigned int *len, uint8_t sequence_id, uint16_t warnings, uint16_t status); -// bool generate_COM_QUIT(MySQL_Data_Stream *myds, bool send, void **ptr, unsigned int *len); -// bool generate_COM_INIT_DB(MySQL_Data_Stream *myds, bool send, void **ptr, unsigned int *len, char *schema); -// bool generate_COM_PING(MySQL_Data_Stream *myds, bool send, void **ptr, unsigned int *len); -// bool generate_COM_RESET_CONNECTION(MySQL_Data_Stream *myds, bool send, void **ptr, unsigned int *len); bool generate_pkt_OK(bool send, void **ptr, unsigned int *len, uint8_t sequence_id, unsigned int affected_rows, uint64_t last_insert_id, uint16_t status, uint16_t warnings, char *msg); bool generate_pkt_ERR(bool send, void **ptr, unsigned int *len, uint8_t sequence_id, uint16_t error_code, char *sql_state, char *sql_message); bool generate_pkt_EOF(bool send, void **ptr, unsigned int *len, uint8_t sequence_id, uint16_t warnings, uint16_t status); - bool generate_COM_QUIT(bool send, void **ptr, unsigned int *len); // bool generate_COM_INIT_DB(bool send, void **ptr, unsigned int *len, char *schema); //bool generate_COM_PING(bool send, void **ptr, unsigned int *len); - bool generate_COM_QUERY(bool send, void **ptr, unsigned int *len, char *query); - bool generate_COM_RESET_CONNECTION(bool send, void **ptr, unsigned int *len); - bool generate_COM_CHANGE_USER(bool send, void **ptr, unsigned int *len); bool generate_pkt_auth_switch_request(bool send, void **ptr, unsigned int *len); bool process_pkt_auth_swich_response(unsigned char *pkt, unsigned int len); @@ -93,8 +82,6 @@ class MySQL_Protocol { uint8_t generate_pkt_row2(PtrSizeArray *PSarrayOut, unsigned int *len, uint8_t sequence_id, int colnums, unsigned long *fieldslen, char **fieldstxt); // bool generate_pkt_initial_handshake(MySQL_Data_Stream *myds, bool send, void **ptr, unsigned int *len); bool generate_pkt_initial_handshake(bool send, void **ptr, unsigned int *len, uint32_t *thread_id); -// bool generate_pkt_handshake_response(MySQL_Data_Stream *myds, bool send, void **ptr, unsigned int *len); - bool generate_pkt_handshake_response(bool send, void **ptr, unsigned int *len); // bool generate_statistics_response(MySQL_Data_Stream *myds, bool send, void **ptr, unsigned int *len); bool generate_statistics_response(bool send, void **ptr, unsigned int *len); @@ -102,14 +89,9 @@ class MySQL_Protocol { // - a data stream (optionally NULL for some) // - pointer to the packet // - size of the packet -// bool process_pkt_OK(MySQL_Data_Stream *myds, unsigned char *pkt, unsigned int len); -// bool process_pkt_handshake_response(MySQL_Data_Stream *myds, unsigned char *pkt, unsigned int len); -// bool process_pkt_initial_handshake(MySQL_Data_Stream *myds, unsigned char *pkt, unsigned int len); -// bool process_pkt_COM_QUERY(MySQL_Data_Stream *myds, unsigned char *pkt, unsigned int len); bool process_pkt_OK(unsigned char *pkt, unsigned int len); bool process_pkt_EOF(unsigned char *pkt, unsigned int len); bool process_pkt_handshake_response(unsigned char *pkt, unsigned int len); - bool process_pkt_initial_handshake(unsigned char *pkt, unsigned int len); bool process_pkt_COM_QUERY(unsigned char *pkt, unsigned int len); bool process_pkt_COM_CHANGE_USER(unsigned char *pkt, unsigned int len); }; diff --git a/include/MySQL_Session.h b/include/MySQL_Session.h index b163f55a9..a1e365873 100644 --- a/include/MySQL_Session.h +++ b/include/MySQL_Session.h @@ -40,15 +40,6 @@ class MySQL_Session { private: std::stack previous_status; -// bool handler___status_CHANGING_SCHEMA(PtrSize_t *); - bool handler___status_CHANGING_USER_SERVER(PtrSize_t *); -// bool handler___status_CHANGING_CHARSET(PtrSize_t *); -// void handler___status_WAITING_SERVER_DATA___STATE_QUERY_SENT(PtrSize_t *); -// void handler___status_WAITING_SERVER_DATA___STATE_PING_SENT(PtrSize_t *); -// void handler___status_WAITING_SERVER_DATA___STATE_ROW(PtrSize_t *); -// void handler___status_WAITING_SERVER_DATA___STATE_EOF1(PtrSize_t *); - //void handler___status_CONNECTING_SERVER___STATE_NOT_CONNECTED(PtrSize_t *); - //void handler___status_CONNECTING_SERVER___STATE_CLIENT_HANDSHAKE(PtrSize_t *, bool *); void handler___status_CONNECTING_CLIENT___STATE_SERVER_HANDSHAKE(PtrSize_t *, bool *); void handler___status_CHANGING_USER_CLIENT___STATE_CLIENT_HANDSHAKE(PtrSize_t *, bool *); @@ -69,9 +60,6 @@ class MySQL_Session bool handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_COM_QUERY_qpo(PtrSize_t *); void handler___client_DSS_QUERY_SENT___server_DSS_NOT_INITIALIZED__get_connection(); - void handler___client_DSS_QUERY_SENT___send_INIT_DB_to_backend(); - void handler___client_DSS_QUERY_SENT___send_CHANGE_USER_to_backend(); - void handler___client_DSS_QUERY_SENT___send_SET_NAMES_to_backend(); bool handler_special_queries(PtrSize_t *); void RequestEnd(MySQL_Data_Stream *); diff --git a/lib/MySQL_Protocol.cpp b/lib/MySQL_Protocol.cpp index d48b47de3..825c269a7 100644 --- a/lib/MySQL_Protocol.cpp +++ b/lib/MySQL_Protocol.cpp @@ -82,15 +82,6 @@ void proxy_compute_sha1_hash_multi(uint8 *digest, const char *buf1, int len1, co SHA1_Update(&sha1_context, buf1, len1); SHA1_Update(&sha1_context, buf2, len2); SHA1_Final(digest, &sha1_context); - -/* - GChecksum *sha1_context=g_checksum_new(G_CHECKSUM_SHA1); - g_checksum_update(sha1_context, (const unsigned char *)buf1, len1); - g_checksum_update(sha1_context, (const unsigned char *)buf2, len2); - size_t s=SHA_DIGEST_LENGTH; - g_checksum_get_digest(sha1_context,digest,&s); - g_checksum_free(sha1_context); -*/ } @@ -101,14 +92,6 @@ void proxy_compute_sha1_hash(uint8 *digest, const char *buf, int len) { SHA1_Init(&sha1_context); SHA1_Update(&sha1_context, buf, len); SHA1_Final(digest, &sha1_context); - -/* - GChecksum *sha1_context=g_checksum_new(G_CHECKSUM_SHA1); - g_checksum_update(sha1_context, (const unsigned char *)buf, len); - size_t s=SHA_DIGEST_LENGTH; - g_checksum_get_digest(sha1_context,digest,&s); - g_checksum_free(sha1_context); -*/ } void proxy_compute_two_stage_sha1_hash(const char *password, size_t pass_len, uint8 *hash_stage1, uint8 *hash_stage2) { @@ -627,98 +610,6 @@ static unsigned char protocol_version=10; static uint16_t server_status=1; //static char *mysql_server_version = (char *)"5.1.30"; -/* -//void MySQL_Protocol::generate_server_handshake(MySQL_Data_Stream *myds) { -void MySQL_Protocol::generate_server_handshake() { - (*myds)->DSS=STATE_SERVER_HANDSHAKE; - //proxy_mysql_thread_t *thrLD=pthread_getspecific(tsd_key); - proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 7, "Generating handshake pkt\n"); - mysql_hdr myhdr; - myhdr.pkt_id=0; - //myhdr.pkt_length=sizeof(glovars.protocol_version) - myhdr.pkt_length=sizeof(protocol_version) - // + (strlen(glovars.mysql_server_version)+1) - + (strlen(mysql_server_version)+1) - + sizeof(uint32_t) // thread_id - + 8 // scramble1 - + 1 // 0x00 - //+ sizeof(glovars.server_capabilities) - //+ sizeof(glovars.server_language) - //+ sizeof(glovars.server_status) - + sizeof(server_capabilities) - + sizeof(server_language) - + sizeof(server_status) - + 3 // unknown stuff - + 10 // filler - + 12 // scramble2 - + 1 // 0x00 - + (strlen("mysql_native_password")+1); - - unsigned int size=myhdr.pkt_length+sizeof(mysql_hdr); - //mypkt->data=g_slice_alloc0(mypkt->length); - //mypkt->data=l_alloc0(thrLD->sfp, mypkt->length); - unsigned char *ptr=(unsigned char *)l_alloc(size); - memcpy(ptr, &myhdr, sizeof(mysql_hdr)); - //Copy4B(ptr, &myhdr); - int l; - l=sizeof(mysql_hdr); - //srand(pthread_self()); - //uint32_t thread_id=rand()%100000; - //uint32_t thread_id=__sync_fetch_and_add(&glovars.thread_id,1); - uint32_t thread_id=pthread_self(); - - rand_struct rand_st; - //randominit(&rand_st,rand(),rand()); - rand_st.max_value= 0x3FFFFFFFL; - rand_st.max_value_dbl=0x3FFFFFFFL; - rand_st.seed1=rand()%rand_st.max_value; - rand_st.seed2=rand()%rand_st.max_value; - - memcpy(ptr+l, &protocol_version, sizeof(protocol_version)); l+=sizeof(protocol_version); - memcpy(ptr+l, mysql_server_version, strlen(mysql_server_version)); l+=strlen(mysql_server_version)+1; - memcpy(ptr+l, &thread_id, sizeof(uint32_t)); l+=sizeof(uint32_t); -#ifdef MARIADB_BASE_VERSION - proxy_create_random_string((*myds)->myconn->myconn.scramble_buff+0,8,(struct my_rnd_struct *)&rand_st); -#else - proxy_create_random_string((*myds)->myconn->myconn.scramble_buff+0,8,(struct rand_struct *)&rand_st); -#endif - - int i; - for (i=0;i<8;i++) { - if ((*myds)->myconn->myconn.scramble_buff[i]==0) { - (*myds)->myconn->myconn.scramble_buff[i]='a'; - } - } - - memcpy(ptr+l, (*myds)->myconn->myconn.scramble_buff+0, 8); l+=8; - l+=1; //0x00 - memcpy(ptr+l,&server_capabilities, sizeof(server_capabilities)); l+=sizeof(server_capabilities); - memcpy(ptr+l,&server_language, sizeof(server_language)); l+=sizeof(server_language); - memcpy(ptr+l,&server_status, sizeof(server_status)); l+=sizeof(server_status); - memcpy(ptr+l,"\x0f\x80\x15",3); l+=3; - l+=10; //filler - //create_random_string(mypkt->data+l,12,(struct my_rnd_struct *)&rand_st); l+=12; -#ifdef MARIADB_BASE_VERSION - proxy_create_random_string((*myds)->myconn->myconn.scramble_buff+8,12,(struct my_rnd_struct *)&rand_st); -#else - proxy_create_random_string((*myds)->myconn->myconn.scramble_buff+8,12,(struct rand_struct *)&rand_st); -#endif - //create_random_string(scramble_buf+8,12,&rand_st); - - for (i=8;i<20;i++) { - if ((*myds)->myconn->myconn.scramble_buff[i]==0) { - (*myds)->myconn->myconn.scramble_buff[i]='a'; - } - } - - memcpy(ptr+l, (*myds)->myconn->myconn.scramble_buff+8, 12); l+=12; - l+=1; //0x00 - memcpy(ptr+l,"mysql_native_password",strlen("mysql_native_password")); - (*myds)->PSarrayOUT->add((void *)ptr,size); -} -*/ - - //bool MySQL_Protocol::generate_statistics_response(MySQL_Data_Stream *myds, bool send, void **ptr, unsigned int *len) { bool MySQL_Protocol::generate_statistics_response(bool send, void **ptr, unsigned int *len) { // FIXME : this function generates a not useful string. It is a placeholder for now @@ -884,113 +775,6 @@ bool MySQL_Protocol::generate_pkt_OK(bool send, void **ptr, unsigned int *len, u return true; } -//bool MySQL_Protocol::generate_COM_QUIT(MySQL_Data_Stream *myds, bool send, void **ptr, unsigned int *len) { -bool MySQL_Protocol::generate_COM_QUIT(bool send, void **ptr, unsigned int *len) { - mysql_hdr myhdr; - myhdr.pkt_id=0; - myhdr.pkt_length=1; - unsigned int size=myhdr.pkt_length+sizeof(mysql_hdr); - unsigned char *_ptr=(unsigned char *)l_alloc(size); - memcpy(_ptr, &myhdr, sizeof(mysql_hdr)); - //Copy4B(_ptr, &myhdr); - int l=sizeof(mysql_hdr); - _ptr[l]=0x01; l++; - - if (send==true) { - (*myds)->PSarrayOUT->add((void *)_ptr,size); - } - if (len) { *len=size; } - if (ptr) { *ptr=(void *)_ptr; } - return true; -} - -//bool MySQL_Protocol::generate_COM_INIT_DB(MySQL_Data_Stream *myds, bool send, void **ptr, unsigned int *len, char *schema) { -//bool MySQL_Protocol::generate_COM_INIT_DB(bool send, void **ptr, unsigned int *len, char *schema) { -// uint32_t schema_len=strlen(schema); -// mysql_hdr myhdr; -// myhdr.pkt_id=0; -// myhdr.pkt_length=1+schema_len; -// unsigned int size=myhdr.pkt_length+sizeof(mysql_hdr); -// unsigned char *_ptr=(unsigned char *)l_alloc(size); -// memcpy(_ptr, &myhdr, sizeof(mysql_hdr)); -// //Copy4B(_ptr, &myhdr); -// int l=sizeof(mysql_hdr); -// _ptr[l]=0x02; l++; -// memcpy(_ptr+l, schema, schema_len); -// -// if (send==true) { (*myds)->PSarrayOUT->add((void *)_ptr,size); } -// if (len) { *len=size; } -// if (ptr) { *ptr=(void *)_ptr; } -//#ifdef DEBUG -// if (dump_pkt) { __dump_pkt(__func__,_ptr,size); } -//#endif -// return true; -//} - -bool MySQL_Protocol::generate_COM_QUERY(bool send, void **ptr, unsigned int *len, char *query) { - uint32_t query_len=strlen(query); - mysql_hdr myhdr; - myhdr.pkt_id=0; - myhdr.pkt_length=1+query_len; - unsigned int size=myhdr.pkt_length+sizeof(mysql_hdr); - unsigned char *_ptr=(unsigned char *)l_alloc(size); - memcpy(_ptr, &myhdr, sizeof(mysql_hdr)); - //Copy4B(_ptr, &myhdr); - int l=sizeof(mysql_hdr); - _ptr[l]=0x03; l++; - memcpy(_ptr+l, query, query_len); - - if (send==true) { (*myds)->PSarrayOUT->add((void *)_ptr,size); } - if (len) { *len=size; } - if (ptr) { *ptr=(void *)_ptr; } -#ifdef DEBUG - if (dump_pkt) { __dump_pkt(__func__,_ptr,size); } -#endif - return true; -} - -//bool MySQL_Protocol::generate_COM_PING(MySQL_Data_Stream *myds, bool send, void **ptr, unsigned int *len) { -//bool MySQL_Protocol::generate_COM_PING(bool send, void **ptr, unsigned int *len) { -// mysql_hdr myhdr; -// myhdr.pkt_id=0; -// myhdr.pkt_length=1; -// unsigned int size=myhdr.pkt_length+sizeof(mysql_hdr); -// unsigned char *_ptr=(unsigned char *)l_alloc(size); -// memcpy(_ptr, &myhdr, sizeof(mysql_hdr)); -// //Copy4B(_ptr, &myhdr); -// int l=sizeof(mysql_hdr); -// _ptr[l]=0x0e; l++; -// -// if (send==true) { (*myds)->PSarrayOUT->add((void *)_ptr,size); } -// if (len) { *len=size; } -// if (ptr) { *ptr=(void *)_ptr; } -//#ifdef DEBUG -// if (dump_pkt) { __dump_pkt(__func__,_ptr,size); } -//#endif -// return true; -//} - -//bool MySQL_Protocol::generate_COM_RESET_CONNECTION(MySQL_Data_Stream *myds, bool send, void **ptr, unsigned int *len) { -bool MySQL_Protocol::generate_COM_RESET_CONNECTION(bool send, void **ptr, unsigned int *len) { - mysql_hdr myhdr; - myhdr.pkt_id=0; - myhdr.pkt_length=1; - unsigned int size=myhdr.pkt_length+sizeof(mysql_hdr); - unsigned char *_ptr=(unsigned char *)l_alloc(size); - memcpy(_ptr, &myhdr, sizeof(mysql_hdr)); - //Copy4B(_ptr, &myhdr); - int l=sizeof(mysql_hdr); - _ptr[l]=0x1f; l++; - - if (send==true) { (*myds)->PSarrayOUT->add((void *)_ptr,size); } - if (len) { *len=size; } - if (ptr) { *ptr=(void *)_ptr; } -#ifdef DEBUG - if (dump_pkt) { __dump_pkt(__func__,_ptr,size); } -#endif - return true; -} - //bool MySQL_Protocol::generate_pkt_column_count(MySQL_Data_Stream *myds, bool send, void **ptr, unsigned int *len, uint8_t sequence_id, uint64_t count) { bool MySQL_Protocol::generate_pkt_column_count(bool send, void **ptr, unsigned int *len, uint8_t sequence_id, uint64_t count) { @@ -1206,147 +990,6 @@ uint8_t MySQL_Protocol::generate_pkt_row2(PtrSizeArray *PSarrayOut, unsigned int return pkt_sid; } - -//bool MySQL_Protocol::generate_pkt_handshake_response(MySQL_Data_Stream *myds, bool send, void **ptr, unsigned int *len) { -bool MySQL_Protocol::generate_pkt_handshake_response(bool send, void **ptr, unsigned int *len) { - proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 7, "Generating response handshake pkt\n"); - mysql_hdr myhdr; - myhdr.pkt_id=1; - - uint32_t capabilities = CLIENT_LONG_PASSWORD | CLIENT_FOUND_ROWS | CLIENT_LONG_FLAG | CLIENT_CONNECT_WITH_DB | CLIENT_PROTOCOL_41 | CLIENT_TRANSACTIONS | CLIENT_SECURE_CONNECTION | CLIENT_MULTI_STATEMENTS | CLIENT_MULTI_RESULTS | CLIENT_PS_MULTI_RESULTS ; - - // enable compression - assert(sess); - assert(sess->mybe); - assert(sess->mybe->server_myds); - MySQL_Connection *myconn=sess->mybe->server_myds->myconn; - assert(myconn); - if (myconn->options.compression_min_length) { - if (myconn->options.server_capabilities & CLIENT_COMPRESS) { - capabilities|=CLIENT_COMPRESS; - } - } - - uint32_t max_allowed_packet=1*1024*1024; - assert(sess); - assert(sess->client_myds); - assert(sess->client_myds->myconn); - uint8_t charset=sess->client_myds->myconn->options.charset; - uint8_t _tmp; -/* - pkt += sizeof(mysql_hdr); - capabilities = CPY4(pkt); - pkt += sizeof(uint32_t); - max_pkt = CPY4(pkt); - pkt += sizeof(uint32_t); - charset = *(uint8_t *)pkt; - pkt += 24; - user = pkt; - pkt += strlen((char *)user) + 1; - - pass_len = (capabilities & CLIENT_SECURE_CONNECTION ? *pkt++ : strlen((char *)pkt)); - memcpy(pass, pkt, pass_len); - pass[pass_len] = 0; - - pkt += pass_len; - db = (capabilities & CLIENT_CONNECT_WITH_DB ? pkt : 0); -*/ - - myhdr.pkt_length= 0 - + sizeof(uint32_t) // capabilities - + sizeof(uint32_t) // max_allowed_packet - + sizeof(uint8_t) // charset - + 23 // padding - + strlen(userinfo->username)+1 // user - + ( strlen(userinfo->password) ? 21 : 1 ) - + strlen(userinfo->schemaname) + 1 - + strlen((char *)"mysql_native_password") + 1; - - //MYSQL &myc=(*myds)->myconn->myconn; - - unsigned int size=myhdr.pkt_length+sizeof(mysql_hdr); - unsigned char *_ptr=(unsigned char *)l_alloc(size); - memcpy(_ptr, &myhdr, sizeof(mysql_hdr)); - //Copy4B(_ptr, &myhdr); - int l=sizeof(mysql_hdr); - memcpy(_ptr+l,&capabilities,sizeof(uint32_t)); l+=sizeof(uint32_t); - memcpy(_ptr+l,&max_allowed_packet,sizeof(uint32_t)); l+=sizeof(uint32_t); - _ptr[l]=charset; l++; - memset(_ptr+l,0,23); l+=23; - _tmp=strlen(userinfo->username); - //_ptr[l]=_tmp; l++; - if (_tmp) { - memcpy(_ptr+l,userinfo->username,_tmp); l+=_tmp; - } - _ptr[l++]=0; - if (strlen(userinfo->password)) { - _ptr[l++]=20; - char reply[SHA_DIGEST_LENGTH+1]; - reply[SHA_DIGEST_LENGTH]='\0'; - proxy_scramble(reply, (*myds)->myconn->scramble_buff, userinfo->password); - memcpy(_ptr+l,reply,20); l+=20; - } else { - _ptr[l++]=0; - } - _tmp=strlen(userinfo->schemaname); - memcpy(_ptr+l,userinfo->schemaname,_tmp+1); - l+=_tmp+1; - memcpy(_ptr+l,(char *)"mysql_native_password",strlen((char *)"mysql_native_password")+1); - - if (send==true) { (*myds)->PSarrayOUT->add((void *)_ptr,size); } - if (len) { *len=size; } - if (ptr) { *ptr=(void *)_ptr; } -#ifdef DEBUG - if (dump_pkt) { __dump_pkt(__func__,_ptr,size); } -#endif - - return true; -} - -bool MySQL_Protocol::generate_COM_CHANGE_USER(bool send, void **ptr, unsigned int *len) { - proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 7, "Generating response handshake pkt\n"); - mysql_hdr myhdr; - myhdr.pkt_id=0; - uint8_t _tmp; - - - myhdr.pkt_length= 1 // COM_CHANGE_USER - + strlen(userinfo->username)+1 // user - + ( strlen(userinfo->password) ? 21 : 1 ) - + strlen(userinfo->schemaname) + 1; - - unsigned int size=myhdr.pkt_length+sizeof(mysql_hdr); - unsigned char *_ptr=(unsigned char *)l_alloc(size); - memcpy(_ptr, &myhdr, sizeof(mysql_hdr)); - int l=sizeof(mysql_hdr); - _ptr[l++]=0x11; // COM_CHANGE_USER - _tmp=strlen(userinfo->username); - if (_tmp) { - memcpy(_ptr+l,userinfo->username,_tmp); l+=_tmp; - } - _ptr[l++]=0; - if (strlen(userinfo->password)) { - _ptr[l++]=20; - char reply[SHA_DIGEST_LENGTH+1]; - reply[SHA_DIGEST_LENGTH]='\0'; - proxy_scramble(reply, (*myds)->myconn->scramble_buff, userinfo->password); - memcpy(_ptr+l,reply,20); l+=20; - } else { - _ptr[l++]=0; - } - _tmp=strlen(userinfo->schemaname); - memcpy(_ptr+l,userinfo->schemaname,_tmp+1); - - if (send==true) { (*myds)->PSarrayOUT->add((void *)_ptr,size); } - if (len) { *len=size; } - if (ptr) { *ptr=(void *)_ptr; } -#ifdef DEBUG - if (dump_pkt) { __dump_pkt(__func__,_ptr,size); } -#endif - - return true; -} - bool MySQL_Protocol::generate_pkt_auth_switch_request(bool send, void **ptr, unsigned int *len) { proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 7, "Generating auth switch request pkt\n"); mysql_hdr myhdr; @@ -1560,82 +1203,6 @@ bool MySQL_Protocol::process_pkt_COM_QUERY(unsigned char *pkt, unsigned int len) return ret; } -//bool MySQL_Protocol::process_pkt_initial_handshake(MySQL_Data_Stream *myds, unsigned char *pkt, unsigned int len) { -bool MySQL_Protocol::process_pkt_initial_handshake(unsigned char *pkt, unsigned int len) { - //return PKT_PARSED; - bool ret=false; - mysql_hdr hdr; - memcpy(&hdr,pkt,sizeof(mysql_hdr)); - //Copy4B(&hdr,pkt); - pkt += sizeof(mysql_hdr); - //MYSQL &myc=(*myds)->myconn->myconn; - - if (*pkt != 0x0A || len < 33) { - goto exit_process_pkt_initial_handshake; - } - uint8_t protocol; - uint16_t capabilities_lower; - uint16_t capabilities_upper; - uint32_t capabilities; - uint8_t charset; - //uint16_t status; - uint32_t thread_id; - - unsigned char * version; - unsigned char * salt1; - unsigned char * salt2; - - protocol = *(uint8_t *)pkt; - pkt += sizeof(uint8_t); - version = pkt; - pkt += strlen((char *)version) + 1; - thread_id = CPY4(pkt); - pkt += sizeof(uint32_t); - salt1 = pkt; - pkt += strlen((char *)salt1) + 1; - capabilities_lower = CPY2(pkt); - pkt += sizeof(uint16_t); - charset = *(uint8_t *)pkt; - pkt += sizeof(uint8_t); - prot_status = CPY2(pkt); - pkt += sizeof(uint16_t); - capabilities_upper = CPY2(pkt); - pkt += sizeof(uint16_t); - pkt += 11; - salt2 = pkt; - - // FIXME: the next two lines are here just to prevent this: warning: variable ‘salt2’ set but not used [-Wunused-but-set-variable] - // salt2 needs to be handled - salt2++; - salt2 = pkt; - - capabilities=capabilities_upper << 16; - capabilities+=capabilities_lower; - - proxy_debug(PROXY_DEBUG_MYSQL_PROTOCOL,1,"Handshake \n", protocol, version, thread_id, capabilities, charset, prot_status); -// if(op.verbose) unmask_caps(caps); - - - - (*myds)->myconn->options.server_capabilities=capabilities; - //myc.charset=(const charset_info_st *)l_alloc(sizeof(struct charset_info_st)); - //myc.charset=(const charset_info_st *)malloc(sizeof(struct charset_info_st)); - //const_cast(myc.charset)->nr=charset; - //myc.thread_id=thread_id; - //myc.server_version=l_strdup((const char *)version); - (*myds)->myconn->options.server_version=strdup((const char *)version); - (*myds)->myconn->options.protocol_version=protocol; - (*myds)->myconn->options.charset=charset; - - memcpy((*myds)->myconn->scramble_buff,(const char *)salt1,strlen((char *)salt1)); - memcpy((*myds)->myconn->scramble_buff+strlen((char *)salt1),(const char *)salt2,strlen((char *)salt2)); - - ret=true; - -exit_process_pkt_initial_handshake: - return ret; - -} bool MySQL_Protocol::process_pkt_auth_swich_response(unsigned char *pkt, unsigned int len) { bool ret=false; @@ -1740,28 +1307,6 @@ bool MySQL_Protocol::process_pkt_COM_CHANGE_USER(unsigned char *pkt, unsigned in //if (password) free(password); if (password) l_free_string(password); -/* - //cur+=1; -// g_free(sess->mysql_username); - free(userinfo->username); - //unsigned char *_ptr=pkt+cur; - user=pkt+cur; - //sess->mysql_username=g_strdup(ptr); - cur+=strlen((const char *)user); - cur+=2; - //memcpy(sess->scramble_buf,mypkt->data+cur,20); - memcpy((*myds)->myconn->scramble_buff, pkt+cur, 20); - cur+=20; - //g_free(sess->mysql_schema_cur); - //ptr=mypkt->data+cur; - db=pkt+cur; - //sess->mysql_schema_cur=g_strdup(ptr); - userinfo->username=strdup((const char *)user); - // userinfo->password=strdup((const char *)password); - if (strlen((char *)db)) userinfo->set_schemaname((char *)db,strlen((char *)db)); // FIXME: buggy - proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "CHANGE USER: Username %s , schema %s\n" , userinfo->username, userinfo->schemaname); -*/ -// ret=true; return ret; } @@ -1862,21 +1407,6 @@ bool MySQL_Protocol::process_pkt_handshake_response(unsigned char *pkt, unsigned if (use_ssl) return true; if (ret==true) { - //MYSQL &myc=(*myds)->myconn->myconn; - //myc.user=strdup((const char *)user); - //if (password) myc.passwd=strdup(password); - //if (db) myc.db=strdup((const char *)db); -/* - myc.user=l_strdup((const char *)user); - if (password) myc.passwd=l_strdup(password); - if (db) myc.db=l_strdup((const char *)db); -*/ - //myc.server_capabilities=capabilities; - //myc.charset=(const charset_info_st *)malloc(sizeof(struct charset_info_st)); -// myc.charset=(const charset_info_st *)l_alloc(sizeof(struct charset_info_st)); - //onst_cast(myc.charset)->nr=charset; - //myds->myconn->myconn - (*myds)->myconn->options.max_allowed_pkt=max_pkt; (*myds)->DSS=STATE_CLIENT_HANDSHAKE; @@ -1896,9 +1426,6 @@ bool MySQL_Protocol::process_pkt_handshake_response(unsigned char *pkt, unsigned return ret; } -//uint16_t get_status(unsigned char *pkt, unsigned int len) { -//} - MySQL_ResultSet::MySQL_ResultSet(MySQL_Protocol *_myprot, MYSQL_RES *_res, MYSQL *_my) { transfer_started=false; diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index 310035b12..1941264d7 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -1333,36 +1333,6 @@ __exit_DSS__STATE_NOT_INITIALIZED: } -bool MySQL_Session::handler___status_CHANGING_USER_SERVER(PtrSize_t *pkt) { - proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Statuses: CHANGING_USER_SERVER - UNKNWON\n"); - if (mybe->server_myds->myprot.process_pkt_OK((unsigned char *)pkt->ptr,pkt->size)==true) { - l_free(pkt->size,pkt->ptr); - mybe->server_myds->DSS=STATE_READY; - //mybe->myconn=server_myds->myconn; - status=WAITING_SERVER_DATA; - unsigned int k; - PtrSize_t pkt2; - for (k=0; kserver_myds->PSarrayOUTpending->len;) { - mybe->server_myds->PSarrayOUTpending->remove_index(0,&pkt2); - mybe->server_myds->PSarrayOUT->add(pkt2.ptr, pkt2.size); - mybe->server_myds->DSS=STATE_QUERY_SENT_DS; - } - // set prepared statement processing - mybe->server_myds->myconn->processing_prepared_statement_prepare=client_myds->myconn->processing_prepared_statement_prepare; - return true; - } else { - l_free(pkt->size,pkt->ptr); - set_unhealthy(); - //mybe->myconn=server_myds->myconn; - // if we reach here, server_myds->DSS should be STATE_QUERY_SENT , therefore the connection to the backend should be dropped anyway - // although we enforce this here - mybe->server_myds->myconn->reusable=false; - return false; - } - return false; -} - - void MySQL_Session::handler___status_WAITING_SERVER_DATA___STATE_READING_COM_STMT_PREPARE_RESPONSE(PtrSize_t *pkt) { unsigned char c; c=*((unsigned char *)pkt->ptr+sizeof(mysql_hdr)); @@ -1758,33 +1728,6 @@ void MySQL_Session::handler___client_DSS_QUERY_SENT___server_DSS_NOT_INITIALIZED } } -void MySQL_Session::handler___client_DSS_QUERY_SENT___send_INIT_DB_to_backend() { - mybe->server_myds->move_from_OUT_to_OUTpending(); - mybe->server_myds->myconn->userinfo->set_schemaname(client_myds->myconn->userinfo->schemaname,strlen(client_myds->myconn->userinfo->schemaname)); - status=CHANGING_SCHEMA; - mybe->server_myds->DSS=STATE_MARIADB_INITDB; - mybe->server_myds->myconn->async_state_machine=ASYNC_INITDB_START; - mybe->server_myds->myconn->handler(0); -} - -void MySQL_Session::handler___client_DSS_QUERY_SENT___send_SET_NAMES_to_backend() { - mybe->server_myds->move_from_OUT_to_OUTpending(); - mybe->server_myds->myconn->set_charset(client_myds->myconn->options.charset); - mybe->server_myds->DSS=STATE_MARIADB_SET_NAMES; - mybe->server_myds->myconn->async_state_machine=ASYNC_SET_NAMES_START; - mybe->server_myds->myconn->handler(0); - status=CHANGING_CHARSET; -} - -void MySQL_Session::handler___client_DSS_QUERY_SENT___send_CHANGE_USER_to_backend() { - mybe->server_myds->move_from_OUT_to_OUTpending(); - mybe->server_myds->myconn->userinfo->set(client_myds->myconn->userinfo); - mybe->server_myds->myprot.generate_COM_CHANGE_USER(true,NULL,NULL); - mybe->server_myds->DSS=STATE_QUERY_SENT_DS; - status=CHANGING_USER_SERVER; -} - - void MySQL_Session::MySQL_Result_to_MySQL_wire(MYSQL *mysql, MySQL_ResultSet *MyRS) { if (MyRS) { assert(MyRS->result);