From 4a6e3e9fceb9ca05c66ec6c3caeab92bf86b111f Mon Sep 17 00:00:00 2001 From: Konstantin Osipov <kostja@tarantool.org> Date: Fri, 7 Nov 2014 18:12:54 +0300 Subject: [PATCH] session_set_user() takes a user --- src/box/authentication.cc | 2 +- src/box/iproto.cc | 2 -- src/box/lua/call.cc | 4 ++-- src/box/lua/session.cc | 2 +- src/box/session.cc | 10 ++++++---- src/box/session.h | 7 ++++--- src/box/user_cache.h | 4 +++- 7 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/box/authentication.cc b/src/box/authentication.cc index 477063df33..fa64b1e3ff 100644 --- a/src/box/authentication.cc +++ b/src/box/authentication.cc @@ -54,6 +54,6 @@ authenticate(const char *user_name, uint32_t len, if (scramble_check(scramble, session->salt, user->hash2)) tnt_raise(ClientError, ER_PASSWORD_MISMATCH, user->name); - session_set_user(session, user->auth_token, user->uid); + session_set_user(session, user); } diff --git a/src/box/iproto.cc b/src/box/iproto.cc index 21b3a91b3e..866a3be5d3 100644 --- a/src/box/iproto.cc +++ b/src/box/iproto.cc @@ -772,8 +772,6 @@ iproto_process_connect(struct iproto_request *request) IPROTO_GREETING_SIZE); fiber_set_session(fiber(), con->session); session_run_on_connect_triggers(con->session); - /* Set session user to guest, until it is authenticated. */ - session_set_user(con->session, GUEST, GUEST); } catch (ClientError *e) { iproto_reply_error(&iobuf->out, e, request->header.type); try { diff --git a/src/box/lua/call.cc b/src/box/lua/call.cc index fbca7f10f0..6c661edcb2 100644 --- a/src/box/lua/call.cc +++ b/src/box/lua/call.cc @@ -537,14 +537,14 @@ SetuidGuard::SetuidGuard(const char *name, uint32_t name_len, setuid = true; orig_auth_token = user->auth_token; orig_uid = user->uid; - session_set_user(session(), func->auth_token, func->uid); + session_set_user(session(), user_by_token(func->auth_token)); } } SetuidGuard::~SetuidGuard() { if (setuid) - session_set_user(session(), orig_auth_token, orig_uid); + session_set_user(session(), user_by_token(orig_auth_token)); } /** diff --git a/src/box/lua/session.cc b/src/box/lua/session.cc index f50bd3eaf1..c6f1edff31 100644 --- a/src/box/lua/session.cc +++ b/src/box/lua/session.cc @@ -97,7 +97,7 @@ lbox_session_su(struct lua_State *L) } else { user = user_cache_find(lua_tointeger(L, 1)); } - session_set_user(session, user->auth_token, user->uid); + session_set_user(session, user); return 0; } diff --git a/src/box/session.cc b/src/box/session.cc index 7f4189ddbe..e790da629e 100644 --- a/src/box/session.cc +++ b/src/box/session.cc @@ -35,7 +35,7 @@ #include "exception.h" #include "random.h" #include <sys/socket.h> -#include "user_def.h" +#include "user_cache.h" static struct mh_i32ptr_t *session_registry; @@ -79,7 +79,8 @@ session_create(int fd, uint64_t cookie) session->fiber_on_stop = { rlist_nil, session_on_stop, NULL, NULL }; - session_set_user(session, ADMIN, ADMIN); + /* For on_connect triggers. */ + session_set_user(session, user_by_token(ADMIN)); random_bytes(session->salt, SESSION_SEED_SIZE); struct mh_i32ptr_node_t node; node.key = session->id; @@ -99,7 +100,7 @@ void session_run_on_disconnect_triggers(struct session *session) { /* For triggers. */ - session_set_user(session, ADMIN, ADMIN); + session_set_user(session, user_by_token(ADMIN)); try { trigger_run(&session_on_disconnect, NULL); } catch (Exception *e) { @@ -113,8 +114,9 @@ session_run_on_disconnect_triggers(struct session *session) void session_run_on_connect_triggers(struct session *session) { - (void) session; trigger_run(&session_on_connect, NULL); + /* Set session user to guest, until it is authenticated. */ + session_set_user(session, user_by_token(GUEST)); } void diff --git a/src/box/session.h b/src/box/session.h index 050512da6a..99d583f3b4 100644 --- a/src/box/session.h +++ b/src/box/session.h @@ -32,6 +32,7 @@ #include <stdbool.h> #include "trigger.h" #include "fiber.h" +#include "user_def.h" enum { SESSION_SEED_SIZE = 32, SESSION_DELIM_SIZE = 16 }; @@ -95,10 +96,10 @@ session_find(uint32_t sid); /** Set session auth token and user id. */ static inline void -session_set_user(struct session *session, uint8_t auth_token, uint32_t uid) +session_set_user(struct session *session, struct user_def *user) { - session->auth_token = auth_token; - session->uid = uid; + session->auth_token = user->auth_token; + session->uid = user->uid; } /** Global on-connect triggers. */ diff --git a/src/box/user_cache.h b/src/box/user_cache.h index 38d3292edc..aa5172cbb5 100644 --- a/src/box/user_cache.h +++ b/src/box/user_cache.h @@ -70,6 +70,8 @@ user_cache_delete(uint32_t uid); struct user_def * user_by_id(uint32_t uid); +#define user_by_token(token) (users + token) + /* Find a user by name. Used by authentication. */ struct user_def * user_cache_find(uint32_t uid); @@ -83,7 +85,7 @@ user_cache_find_by_name(const char *name, uint32_t len); #define user() \ ({ \ struct session *s = session(); \ - struct user_def *u = &users[s->auth_token]; \ + struct user_def *u = user_by_token(s->auth_token); \ if (u->auth_token != s->auth_token || \ u->uid != s->uid) { \ tnt_raise(ClientError, ER_NO_SUCH_USER, \ -- GitLab