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