/** * @test * network_mysqld_proto_get_auth_response() can decode a pre-4.0 packet * network_mysqld_proto_append_auth_response() can encode the result * of the network_mysqld_proto_get_auth_response() */ void t_mysqld_get_auth_response_pre_41(void) { const char raw_packet[] = "\205$" "\0\0\0" "root\0" ; network_mysqld_auth_response *auth; network_packet packet; int err = 0; auth = network_mysqld_auth_response_new(); packet.data = g_string_new_len(C(raw_packet)); packet.offset = 0; err = err || network_mysqld_proto_get_auth_response(&packet, auth); g_assert_cmpint(err, ==, 0); g_assert(auth->username); g_assert_cmpint(auth->username->len, ==, 4); g_assert_cmpstr(auth->username->str, ==, "root"); g_assert_cmpuint(auth->capabilities, ==, CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG | CLIENT_LOCAL_FILES | CLIENT_INTERACTIVE | CLIENT_TRANSACTIONS ); g_assert_cmpuint(auth->max_packet_size, ==, 0); g_string_truncate(packet.data, 0); packet.offset = 0; err = err || network_mysqld_proto_append_auth_response(packet.data, auth); g_assert_cmpint(err, ==, 0); g_assert_cmpint(packet.data->len, ==, sizeof(raw_packet) - 1); g_assert_cmpint(TRUE, ==, g_memeq(S(packet.data), raw_packet, packet.data->len)); network_mysqld_auth_response_free(auth); /* empty auth struct */ g_string_truncate(packet.data, 0); packet.offset = 0; auth = network_mysqld_auth_response_new(); err = err || network_mysqld_proto_append_auth_response(packet.data, auth); g_assert_cmpint(err, ==, 0); network_mysqld_auth_response_free(auth); g_string_free(packet.data, TRUE); }
static int lua_proto_get_response_packet (lua_State *L) { size_t packet_len; const char *packet_str = luaL_checklstring(L, 1, &packet_len); guint32 server_capabilities = luaL_checkint(L, 2); network_mysqld_auth_response *auth_response; network_packet packet; GString s; int err = 0; s.str = (char *)packet_str; s.len = packet_len; packet.data = &s; packet.offset = 0; auth_response = network_mysqld_auth_response_new(server_capabilities); err = err || network_mysqld_proto_get_auth_response(&packet, auth_response); if (err) { network_mysqld_auth_response_free(auth_response); luaL_error(L, "%s: network_mysqld_proto_get_auth_response() failed", G_STRLOC); return 0; } lua_newtable(L); LUA_EXPORT_INT_TO(auth_response, client_capabilities, "capabilities"); LUA_EXPORT_INT(auth_response, server_capabilities); LUA_EXPORT_INT(auth_response, max_packet_size); LUA_EXPORT_INT(auth_response, charset); LUA_EXPORT_STR(auth_response, username); LUA_EXPORT_STR_TO(auth_response, auth_plugin_data, "response"); LUA_EXPORT_STR(auth_response, auth_plugin_name); LUA_EXPORT_STR(auth_response, database); network_mysqld_auth_response_free(auth_response); return 1; }
/** * @test * network_mysqld_proto_get_auth_response() can decode a broken pre-4.0 packet */ void t_mysqld_get_auth_response_no_term(void) { const char raw_packet[] = "\205$" "\0\0\0" "root\0" /* missing trailing \0 */ "foo" ; network_mysqld_auth_response *auth; network_packet packet; int err = 0; auth = network_mysqld_auth_response_new(); packet.data = g_string_new_len(C(raw_packet)); packet.offset = 0; err = err || network_mysqld_proto_get_auth_response(&packet, auth); g_assert_cmpint(err, !=, 0); network_mysqld_auth_response_free(auth); g_string_free(packet.data, TRUE); }
/** * @test * network_mysqld_proto_get_auth_response() can decode a string * network_mysqld_proto_append_auth_response() can encode the result * of the network_mysqld_proto_get_auth_response() */ void t_mysqld_get_auth_response(void) { const char raw_packet[] = "\205\246\3\0" "\0\0\0\1" "\10" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "root\0" "\24\241\304\260>\255\1:F,\256\337K\323\340\4\273\354I\256\204" ; network_mysqld_auth_response *auth; network_packet packet; int err = 0; auth = network_mysqld_auth_response_new(); packet.data = g_string_new_len(C(raw_packet)); packet.offset = 0; err = err || network_mysqld_proto_get_auth_response(&packet, auth); g_assert_cmpint(err, ==, 0); g_assert(auth->username); g_assert_cmpint(auth->username->len, ==, 4); g_assert_cmpstr(auth->username->str, ==, "root"); g_assert_cmpuint(auth->capabilities, ==, CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG | CLIENT_LOCAL_FILES | CLIENT_PROTOCOL_41 | CLIENT_INTERACTIVE | CLIENT_TRANSACTIONS | CLIENT_SECURE_CONNECTION | CLIENT_MULTI_STATEMENTS | CLIENT_MULTI_RESULTS); g_assert_cmpuint(auth->max_packet_size, ==, 1 << 24); g_assert_cmpuint(auth->charset , ==, 8); g_string_truncate(packet.data, 0); packet.offset = 0; err = err || network_mysqld_proto_append_auth_response(packet.data, auth); g_assert_cmpint(err, ==, 0); g_assert_cmpint(packet.data->len, ==, sizeof(raw_packet) - 1); g_assert_cmpint(TRUE, ==, g_memeq(S(packet.data), raw_packet, packet.data->len)); network_mysqld_auth_response_free(auth); /* empty auth struct */ g_string_truncate(packet.data, 0); packet.offset = 0; auth = network_mysqld_auth_response_new(); err = err || network_mysqld_proto_append_auth_response(packet.data, auth); g_assert_cmpint(err, ==, 0); network_mysqld_auth_response_free(auth); g_string_free(packet.data, TRUE); }