Fixed compile bug when using --with-pam but not --with-utmp.
[Samba/gbeck.git] / source / smbd / session.c
blob4ede1d9a687f88e7bb04c16ab9252828154fa294
1 /*
2 Unix SMB/Netbios implementation.
3 Version 2.0
4 session handling for utmp and PAM
5 Copyright (C) tridge@samba.org 2001
6 Copyright (C) abartlet@pcug.org.au 2001
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 /* a "session" is claimed when we do a SessionSetupX operation
24 and is yielded when the corresponding vuid is destroyed.
26 sessions are used to populate utmp and PAM session structures
29 #include "includes.h"
31 #if defined(WITH_PAM) || defined(WITH_UTMP)
33 static TDB_CONTEXT *tdb;
34 struct sessionid {
35 fstring username;
36 fstring hostname;
37 fstring id_str;
38 uint32 id_num;
39 uint32 pid;
42 /* called when a session is created */
43 BOOL session_claim(uint16 vuid)
45 user_struct *vuser = get_valid_user_struct(vuid);
46 int i;
47 TDB_DATA data;
48 struct sessionid sessionid;
49 pstring dbuf;
50 int dlen;
51 uint32 pid = (uint32)sys_getpid();
52 TDB_DATA key;
53 fstring keystr;
55 vuser->session_id = 0;
57 /* don't register sessions for the guest user - its just too
58 expensive to go through pam session code for browsing etc */
59 if (strequal(vuser->user.unix_name,lp_guestaccount(-1))) {
60 return True;
63 if (!tdb) {
64 tdb = tdb_open(lock_path("sessionid.tdb"), 0, TDB_CLEAR_IF_FIRST,
65 O_RDWR | O_CREAT, 0644);
66 if (!tdb) {
67 DEBUG(1,("session_claim: failed to open sessionid tdb\n"));
68 return False;
72 ZERO_STRUCT(sessionid);
74 data.dptr = NULL;
75 data.dsize = 0;
77 for (i=1;i<MAX_SESSION_ID;i++) {
78 slprintf(keystr, sizeof(keystr)-1, "ID/%d", i);
79 key.dptr = keystr;
80 key.dsize = strlen(keystr)+1;
82 if (tdb_store(tdb, key, data, TDB_INSERT) == 0) break;
85 if (i == MAX_SESSION_ID) {
86 DEBUG(1,("session_claim: out of session IDs (max is %d)\n",
87 MAX_SESSION_ID));
88 return False;
91 fstrcpy(sessionid.username, vuser->user.unix_name);
92 #if WITH_UTMP
93 fstrcpy(sessionid.hostname, lp_utmp_hostname());
94 #else
96 extern fstring remote_machine;
97 fstrcpy(sessionid.hostname, remote_machine);
99 #endif
100 slprintf(sessionid.id_str, sizeof(sessionid.id_str)-1, SESSION_TEMPLATE, i);
101 sessionid.id_num = i;
102 sessionid.pid = pid;
104 dlen = tdb_pack(dbuf, sizeof(dbuf), "fffdd",
105 sessionid.username, sessionid.hostname, sessionid.id_str,
106 sessionid.id_num, sessionid.pid);
108 data.dptr = dbuf;
109 data.dsize = dlen;
110 if (tdb_store(tdb, key, data, TDB_MODIFY) != 0) {
111 DEBUG(1,("session_claim: unable to create session id record\n"));
112 return False;
115 #if WITH_PAM
116 if (!pam_session(True, sessionid.username, sessionid.id_str)) {
117 DEBUG(1,("pam_session rejected the session for %s [%s]\n",
118 sessionid.username, sessionid.id_str));
119 tdb_delete(tdb, key);
120 return False;
122 #endif
124 #if WITH_UTMP
125 if (lp_utmp()) {
126 sys_utmp_claim(sessionid.username, sessionid.hostname,
127 sessionid.id_str, sessionid.id_num);
129 #endif
131 vuser->session_id = i;
132 return True;
135 /* called when a session is destroyed */
136 void session_yield(uint16 vuid)
138 user_struct *vuser = get_valid_user_struct(vuid);
139 TDB_DATA data;
140 struct sessionid sessionid;
141 TDB_DATA key;
142 fstring keystr;
144 if (!tdb) return;
146 if (vuser->session_id == 0) {
147 return;
150 slprintf(keystr, sizeof(keystr)-1, "ID/%d", vuser->session_id);
152 key.dptr = keystr;
153 key.dsize = strlen(keystr)+1;
155 data = tdb_fetch(tdb, key);
156 if (data.dptr == NULL) {
157 return;
160 tdb_unpack(data.dptr, data.dsize, "fffdd",
161 &sessionid.username, &sessionid.hostname, &sessionid.id_str,
162 &sessionid.id_num, &sessionid.pid);
164 #if WITH_UTMP
165 if (lp_utmp()) {
166 sys_utmp_yield(sessionid.username, sessionid.hostname,
167 sessionid.id_str, sessionid.id_num);
169 #endif
171 #if WITH_PAM
172 pam_session(False, sessionid.username, sessionid.id_str);
173 #endif
175 tdb_delete(tdb, key);
178 #else
179 /* null functions - no session support needed */
180 BOOL session_claim(uint16 vuid) { return True; }
181 void session_yield(uint16 vuid) {}
182 #endif