2 Unix SMB/Netbios implementation.
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
31 #if defined(WITH_PAM) || defined(WITH_UTMP)
33 static TDB_CONTEXT
*tdb
;
42 /* called when a session is created */
43 BOOL
session_claim(uint16 vuid
)
45 user_struct
*vuser
= get_valid_user_struct(vuid
);
48 struct sessionid sessionid
;
51 uint32 pid
= (uint32
)sys_getpid();
56 vuser
->session_id
= 0;
58 /* don't register sessions for the guest user - its just too
59 expensive to go through pam session code for browsing etc */
60 if (strequal(vuser
->user
.unix_name
,lp_guestaccount(-1))) {
65 tdb
= tdb_open(lock_path("sessionid.tdb"), 0, TDB_CLEAR_IF_FIRST
,
66 O_RDWR
| O_CREAT
, 0644);
68 DEBUG(1,("session_claim: failed to open sessionid tdb\n"));
73 ZERO_STRUCT(sessionid
);
78 for (i
=1;i
<MAX_SESSION_ID
;i
++) {
79 slprintf(keystr
, sizeof(keystr
)-1, "ID/%d", i
);
81 key
.dsize
= strlen(keystr
)+1;
83 if (tdb_store(tdb
, key
, data
, TDB_INSERT
) == 0) break;
86 if (i
== MAX_SESSION_ID
) {
87 DEBUG(1,("session_claim: out of session IDs (max is %d)\n",
92 hostname
= client_name();
93 if (strequal(hostname
,"UNKNOWN"))
94 hostname
= client_addr();
96 fstrcpy(sessionid
.username
, vuser
->user
.unix_name
);
97 fstrcpy(sessionid
.hostname
, hostname
);
98 slprintf(sessionid
.id_str
, sizeof(sessionid
.id_str
)-1, SESSION_TEMPLATE
, i
);
102 dlen
= tdb_pack(dbuf
, sizeof(dbuf
), "fffdd",
103 sessionid
.username
, sessionid
.hostname
, sessionid
.id_str
,
104 sessionid
.id_num
, sessionid
.pid
);
108 if (tdb_store(tdb
, key
, data
, TDB_MODIFY
) != 0) {
109 DEBUG(1,("session_claim: unable to create session id record\n"));
114 if (!smb_pam_session(True
, sessionid
.username
, sessionid
.id_str
, sessionid
.hostname
)) {
115 DEBUG(1,("smb_pam_session rejected the session for %s [%s]\n",
116 sessionid
.username
, sessionid
.id_str
));
117 tdb_delete(tdb
, key
);
124 sys_utmp_claim(sessionid
.username
, sessionid
.hostname
,
125 sessionid
.id_str
, sessionid
.id_num
);
129 vuser
->session_id
= i
;
133 /* called when a session is destroyed */
134 void session_yield(uint16 vuid
)
136 user_struct
*vuser
= get_valid_user_struct(vuid
);
138 struct sessionid sessionid
;
144 if (vuser
->session_id
== 0) {
148 slprintf(keystr
, sizeof(keystr
)-1, "ID/%d", vuser
->session_id
);
151 key
.dsize
= strlen(keystr
)+1;
153 data
= tdb_fetch(tdb
, key
);
154 if (data
.dptr
== NULL
) {
158 tdb_unpack(data
.dptr
, data
.dsize
, "fffdd",
159 &sessionid
.username
, &sessionid
.hostname
, &sessionid
.id_str
,
160 &sessionid
.id_num
, &sessionid
.pid
);
162 safe_free(data
.dptr
);
167 sys_utmp_yield(sessionid
.username
, sessionid
.hostname
,
168 sessionid
.id_str
, sessionid
.id_num
);
173 smb_pam_session(False
, sessionid
.username
, sessionid
.id_str
, sessionid
.hostname
);
176 tdb_delete(tdb
, key
);
180 /* null functions - no session support needed */
181 BOOL
session_claim(uint16 vuid
) { return True
; }
182 void session_yield(uint16 vuid
) {}