29
29
#include "includes.h"
30
#include "smbd/smbd.h"
30
31
#include "smbd/globals.h"
32
/********************************************************************
33
********************************************************************/
35
static struct db_context *session_db_ctx(void)
37
if (session_db_ctx_ptr)
38
return session_db_ctx_ptr;
40
session_db_ctx_ptr = db_open(NULL, lock_path("sessionid.tdb"), 0,
41
TDB_CLEAR_IF_FIRST|TDB_DEFAULT,
42
O_RDWR | O_CREAT, 0644);
43
return session_db_ctx_ptr;
46
bool session_init(void)
48
if (session_db_ctx() == NULL) {
49
DEBUG(1,("session_init: failed to open sessionid tdb\n"));
56
36
/********************************************************************
57
37
called when a session is created
58
38
********************************************************************/
60
bool session_claim(user_struct *vuser)
40
bool session_claim(struct smbd_server_connection *sconn, user_struct *vuser)
42
struct server_id pid = sconn_server_id(sconn);
64
45
struct sessionid sessionid;
65
struct server_id pid = procid_self();
67
const char * hostname;
68
struct db_context *ctx;
69
47
struct db_record *rec;
71
char addr[INET6_ADDRSTRLEN];
73
50
vuser->session_keystr = NULL;
75
52
/* don't register sessions for the guest user - its just too
76
53
expensive to go through pam session code for browsing etc */
77
if (vuser->server_info->guest) {
54
if (vuser->session_info->guest) {
81
if (!(ctx = session_db_ctx())) {
58
if (!sessionid_init()) {
98
75
struct server_id sess_pid;
100
77
snprintf(keystr, sizeof(keystr), "ID/%d", i);
101
key = string_term_tdb_data(keystr);
103
rec = ctx->fetch_locked(ctx, NULL, key);
79
rec = sessionid_fetch_record(NULL, keystr);
105
80
if (rec == NULL) {
106
81
DEBUG(1, ("Could not lock \"%s\"\n", keystr));
140
115
snprintf(keystr, sizeof(keystr), "ID/%s/%u",
141
116
procid_str_static(&pid), vuser->vuid);
142
key = string_term_tdb_data(keystr);
144
rec = ctx->fetch_locked(ctx, NULL, key);
118
rec = sessionid_fetch_record(NULL, keystr);
146
119
if (rec == NULL) {
147
120
DEBUG(1, ("Could not lock \"%s\"\n", keystr));
161
134
client_name() handles this case internally.
164
hostname = client_name(get_client_fd());
165
if (strcmp(hostname, "UNKNOWN") == 0) {
166
hostname = client_addr(get_client_fd(),addr,sizeof(addr));
169
fstrcpy(sessionid.username, vuser->server_info->unix_name);
170
fstrcpy(sessionid.hostname, hostname);
137
fstrcpy(sessionid.username, vuser->session_info->unix_name);
138
fstrcpy(sessionid.hostname, sconn->client_id.name);
171
139
sessionid.id_num = i; /* Only valid for utmp sessions */
172
140
sessionid.pid = pid;
173
sessionid.uid = vuser->server_info->utok.uid;
174
sessionid.gid = vuser->server_info->utok.gid;
141
sessionid.uid = vuser->session_info->utok.uid;
142
sessionid.gid = vuser->session_info->utok.gid;
175
143
fstrcpy(sessionid.remote_machine, get_remote_machine_name());
176
fstrcpy(sessionid.ip_addr_str,
177
client_addr(get_client_fd(),addr,sizeof(addr)));
144
fstrcpy(sessionid.ip_addr_str, sconn->client_id.addr);
178
145
sessionid.connect_start = time(NULL);
180
147
if (!smb_pam_claim_session(sessionid.username, sessionid.id_str,
220
187
void session_yield(user_struct *vuser)
223
189
struct sessionid sessionid;
224
struct db_context *ctx;
225
190
struct db_record *rec;
227
if (!(ctx = session_db_ctx())) return;
229
192
if (!vuser->session_keystr) {
233
key = string_term_tdb_data(vuser->session_keystr);
235
if (!(rec = ctx->fetch_locked(ctx, NULL, key))) {
196
rec = sessionid_fetch_record(NULL, vuser->session_keystr);
258
220
/********************************************************************
259
221
********************************************************************/
261
static bool session_traverse(int (*fn)(struct db_record *db,
265
struct db_context *ctx;
267
if (!(ctx = session_db_ctx())) {
268
DEBUG(3, ("No tdb opened\n"));
272
ctx->traverse_read(ctx, fn, private_data);
276
/********************************************************************
277
********************************************************************/
279
223
struct session_list {
280
224
TALLOC_CTX *mem_ctx;
282
226
struct sessionid *sessions;
285
static int gather_sessioninfo(struct db_record *rec, void *state)
229
static int gather_sessioninfo(const char *key, struct sessionid *session,
287
struct session_list *sesslist = (struct session_list *) state;
288
const struct sessionid *current =
289
(const struct sessionid *) rec->value.dptr;
232
struct session_list *sesslist = (struct session_list *)private_data;
291
234
sesslist->sessions = TALLOC_REALLOC_ARRAY(
292
235
sesslist->mem_ctx, sesslist->sessions, struct sessionid,
300
memcpy(&sesslist->sessions[sesslist->count], current,
243
memcpy(&sesslist->sessions[sesslist->count], session,
301
244
sizeof(struct sessionid));
303
246
sesslist->count++;
305
DEBUG(7,("gather_sessioninfo session from %s@%s\n",
306
current->username, current->remote_machine));
248
DEBUG(7, ("gather_sessioninfo session from %s@%s\n",
249
session->username, session->remote_machine));
314
257
int list_sessions(TALLOC_CTX *mem_ctx, struct sessionid **session_list)
316
259
struct session_list sesslist;
318
262
sesslist.mem_ctx = mem_ctx;
319
263
sesslist.count = 0;
320
264
sesslist.sessions = NULL;
322
if (!session_traverse(gather_sessioninfo, (void *) &sesslist)) {
266
ret = sessionid_traverse_read(gather_sessioninfo, (void *) &sesslist);
323
268
DEBUG(3, ("Session traverse failed\n"));
324
269
SAFE_FREE(sesslist.sessions);
325
270
*session_list = NULL;