X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fsasl.cc;h=5ec8bee2fd454cd09184c2aabcba920a5c6bf94c;hb=24d604ebd655a7e3afe584d3dc4a25f5eca372c3;hp=cb609257cac36dc634e9ccef3be56d5ff6697695;hpb=edbdb9c55b66d2cc1befe6e589c2bfc98ea2d7fb;p=awesomized%2Flibmemcached diff --git a/libmemcached/sasl.cc b/libmemcached/sasl.cc index cb609257..5ec8bee2 100644 --- a/libmemcached/sasl.cc +++ b/libmemcached/sasl.cc @@ -2,7 +2,7 @@ * * Libmemcached library * - * Copyright (C) 2011 Data Differential, http://datadifferential.com/ + * Copyright (C) 2011-2012 Data Differential, http://datadifferential.com/ * Copyright (C) 2006-2009 Brian Aker All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -35,7 +35,7 @@ * */ -#include +#include "libmemcached/common.h" #include #if defined(LIBMEMCACHED_WITH_SASL_SUPPORT) && LIBMEMCACHED_WITH_SASL_SUPPORT @@ -44,18 +44,30 @@ #include #endif +#define CAST_SASL_CB(cb) reinterpret_cast(reinterpret_cast(cb)) + #include -void memcached_set_sasl_callbacks(memcached_st *ptr, +void memcached_set_sasl_callbacks(memcached_st *shell, const sasl_callback_t *callbacks) { - ptr->sasl.callbacks= const_cast(callbacks); - ptr->sasl.is_allocated= false; + Memcached* self= memcached2Memcached(shell); + if (self) + { + self->sasl.callbacks= const_cast(callbacks); + self->sasl.is_allocated= false; + } } -sasl_callback_t *memcached_get_sasl_callbacks(memcached_st *ptr) +sasl_callback_t *memcached_get_sasl_callbacks(memcached_st *shell) { - return ptr->sasl.callbacks; + Memcached* self= memcached2Memcached(shell); + if (self) + { + return self->sasl.callbacks; + } + + return NULL; } /** @@ -67,8 +79,8 @@ sasl_callback_t *memcached_get_sasl_callbacks(memcached_st *ptr) */ static memcached_return_t resolve_names(memcached_instance_st& server, char *laddr, size_t laddr_length, char *raddr, size_t raddr_length) { - char host[NI_MAXHOST]; - char port[NI_MAXSERV]; + char host[MEMCACHED_NI_MAXHOST]; + char port[MEMCACHED_NI_MAXSERV]; struct sockaddr_storage saddr; socklen_t salen= sizeof(saddr); @@ -123,7 +135,7 @@ static void sasl_startup_function(void) } // extern "C" -memcached_return_t memcached_sasl_authenticate_connection(memcached_instance_st *server) +memcached_return_t memcached_sasl_authenticate_connection(memcached_instance_st* server) { if (LIBMEMCACHED_WITH_SASL_SUPPORT == 0) { @@ -148,15 +160,15 @@ memcached_return_t memcached_sasl_authenticate_connection(memcached_instance_st */ protocol_binary_request_no_extras request= { }; - initialize_binary_request(ptr, request.message.header); + initialize_binary_request(server, request.message.header); request.message.header.request.opcode= PROTOCOL_BINARY_CMD_SASL_LIST_MECHS; - if (memcached_io_write(server, request.bytes, - sizeof(request.bytes), 1) != sizeof(request.bytes)) + if (memcached_io_write(server, request.bytes, sizeof(request.bytes), true) != sizeof(request.bytes)) { return MEMCACHED_WRITE_FAILURE; } + assert_msg(server->fd != INVALID_SOCKET, "Programmer error, invalid socket"); memcached_server_response_increment(server); @@ -177,10 +189,11 @@ memcached_return_t memcached_sasl_authenticate_connection(memcached_instance_st return rc; } + assert_msg(server->fd != INVALID_SOCKET, "Programmer error, invalid socket"); /* set ip addresses */ - char laddr[NI_MAXHOST + NI_MAXSERV]; - char raddr[NI_MAXHOST + NI_MAXSERV]; + char laddr[MEMCACHED_NI_MAXHOST + MEMCACHED_NI_MAXSERV]; + char raddr[MEMCACHED_NI_MAXHOST + MEMCACHED_NI_MAXSERV]; if (memcached_failed(rc= resolve_names(*server, laddr, sizeof(laddr), raddr, sizeof(raddr)))) { @@ -204,7 +217,7 @@ memcached_return_t memcached_sasl_authenticate_connection(memcached_instance_st sasl_conn_t *conn; int ret; - if ((ret= sasl_client_new("memcached", server->hostname, laddr, raddr, server->root->sasl.callbacks, 0, &conn) ) != SASL_OK) + if ((ret= sasl_client_new("memcached", server->_hostname, laddr, raddr, server->root->sasl.callbacks, 0, &conn) ) != SASL_OK) { const char *sasl_error_msg= sasl_errstring(ret, NULL, NULL); @@ -242,19 +255,23 @@ memcached_return_t memcached_sasl_authenticate_connection(memcached_instance_st { data, len } }; + assert_msg(server->fd != INVALID_SOCKET, "Programmer error, invalid socket"); if (memcached_io_writev(server, vector, 3, true) == false) { rc= MEMCACHED_WRITE_FAILURE; break; } + assert_msg(server->fd != INVALID_SOCKET, "Programmer error, invalid socket"); memcached_server_response_increment(server); /* read the response */ + assert_msg(server->fd != INVALID_SOCKET, "Programmer error, invalid socket"); rc= memcached_response(server, NULL, 0, NULL); if (rc != MEMCACHED_AUTH_CONTINUE) { break; } + assert_msg(server->fd != INVALID_SOCKET, "Programmer error, invalid socket"); ret= sasl_client_step(conn, memcached_result_value(&server->root->result), (unsigned int)memcached_result_length(&server->root->result), @@ -305,10 +322,11 @@ static int get_password(sasl_conn_t *conn, void *context, int id, return SASL_OK; } -memcached_return_t memcached_set_sasl_auth_data(memcached_st *ptr, +memcached_return_t memcached_set_sasl_auth_data(memcached_st *shell, const char *username, const char *password) { + Memcached* ptr= memcached2Memcached(shell); if (LIBMEMCACHED_WITH_SASL_SUPPORT == 0) { return MEMCACHED_NOT_SUPPORTED; @@ -346,13 +364,13 @@ memcached_return_t memcached_set_sasl_auth_data(memcached_st *ptr, secret->data[password_length]= 0; callbacks[0].id= SASL_CB_USER; - callbacks[0].proc= (int (*)())get_username; + callbacks[0].proc= CAST_SASL_CB(get_username); callbacks[0].context= strncpy(name, username, username_length +1); callbacks[1].id= SASL_CB_AUTHNAME; - callbacks[1].proc= (int (*)())get_username; + callbacks[1].proc= CAST_SASL_CB(get_username); callbacks[1].context= name; callbacks[2].id= SASL_CB_PASS; - callbacks[2].proc= (int (*)())get_password; + callbacks[2].proc= CAST_SASL_CB(get_password); callbacks[2].context= secret; callbacks[3].id= SASL_CB_LIST_END; @@ -362,13 +380,14 @@ memcached_return_t memcached_set_sasl_auth_data(memcached_st *ptr, return MEMCACHED_SUCCESS; } -memcached_return_t memcached_destroy_sasl_auth_data(memcached_st *ptr) +memcached_return_t memcached_destroy_sasl_auth_data(memcached_st *shell) { if (LIBMEMCACHED_WITH_SASL_SUPPORT == 0) { return MEMCACHED_NOT_SUPPORTED; } + Memcached* ptr= memcached2Memcached(shell); if (ptr == NULL) { return MEMCACHED_INVALID_ARGUMENTS; @@ -411,11 +430,11 @@ memcached_return_t memcached_clone_sasl(memcached_st *clone, const memcached_st /* Hopefully we are using our own callback mechanisms.. */ if (source->sasl.callbacks[0].id == SASL_CB_USER && - source->sasl.callbacks[0].proc == (int (*)())get_username && + source->sasl.callbacks[0].proc == CAST_SASL_CB(get_username) && source->sasl.callbacks[1].id == SASL_CB_AUTHNAME && - source->sasl.callbacks[1].proc == (int (*)())get_username && + source->sasl.callbacks[1].proc == CAST_SASL_CB(get_username) && source->sasl.callbacks[2].id == SASL_CB_PASS && - source->sasl.callbacks[2].proc == (int (*)())get_password && + source->sasl.callbacks[2].proc == CAST_SASL_CB(get_password) && source->sasl.callbacks[3].id == SASL_CB_LIST_END) { sasl_secret_t *secret= (sasl_secret_t *)source->sasl.callbacks[2].context;