diff options
Diffstat (limited to 'source')
-rw-r--r-- | source/include/includes.h | 2 | ||||
-rw-r--r-- | source/include/session.h | 41 | ||||
-rw-r--r-- | source/param/loadparm.c | 10 | ||||
-rw-r--r-- | source/smbd/reply.c | 4 | ||||
-rw-r--r-- | source/smbd/server.c | 8 | ||||
-rw-r--r-- | source/smbd/session.c | 43 | ||||
-rw-r--r-- | source/utils/status.c | 104 | ||||
-rw-r--r-- | source/web/statuspage.c | 4 |
8 files changed, 105 insertions, 111 deletions
diff --git a/source/include/includes.h b/source/include/includes.h index 63bcb1192e5..8b138030ef9 100644 --- a/source/include/includes.h +++ b/source/include/includes.h @@ -668,6 +668,8 @@ extern int errno; #include "auth.h" +#include "session.h" + #ifndef MAXCODEPAGELINES #define MAXCODEPAGELINES 256 #endif diff --git a/source/include/session.h b/source/include/session.h new file mode 100644 index 00000000000..9091223e99e --- /dev/null +++ b/source/include/session.h @@ -0,0 +1,41 @@ +/* + Unix SMB/Netbios implementation. + Version 2.0 + session handling for recording currently vailid vuids + Copyright (C) tridge@samba.org 2001 + Copyright (C) Andew Bartlett <abartlet@samba.org> 2001 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* a "session" is claimed when we do a SessionSetupX operation + and is yielded when the corresponding vuid is destroyed. + + sessions are used to populate utmp and PAM session structures +*/ + +struct sessionid { + uid_t uid; + gid_t gid; + fstring username; + fstring hostname; + fstring netbios_name; + fstring remote_machine; + fstring id_str; + uint32 id_num; + uint32 pid; + fstring ip_addr; +}; + diff --git a/source/param/loadparm.c b/source/param/loadparm.c index 543e9bab9f5..85bcd52ff18 100644 --- a/source/param/loadparm.c +++ b/source/param/loadparm.c @@ -149,7 +149,6 @@ typedef struct #ifdef WITH_UTMP char *szUtmpDir; char *szWtmpDir; - char *szUtmpHostname; BOOL bUtmp; #endif char *szSourceEnv; @@ -342,7 +341,6 @@ typedef struct BOOL bCasePreserve; BOOL bShortCasePreserve; BOOL bCaseMangle; - BOOL status; BOOL bHideDotFiles; BOOL bHideUnReadable; BOOL bBrowseable; @@ -457,7 +455,6 @@ static service sDefault = { True, /* case preserve */ True, /* short case preserve */ False, /* case mangle */ - True, /* status */ True, /* bHideDotFiles */ False, /* bHideUnReadable */ True, /* bBrowseable */ @@ -762,8 +759,6 @@ static struct parm_struct parm_table[] = { {"debug pid", P_BOOL, P_GLOBAL, &Globals.bDebugPid, NULL, NULL, 0}, {"debug uid", P_BOOL, P_GLOBAL, &Globals.bDebugUid, NULL, NULL, 0}, - {"status", P_BOOL, P_LOCAL, &sDefault.status, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE | FLAG_PRINT}, - {"Protocol Options", P_SEP, P_SEPARATOR}, {"protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, 0}, @@ -960,7 +955,6 @@ static struct parm_struct parm_table[] = { #ifdef WITH_UTMP {"utmp directory", P_STRING, P_GLOBAL, &Globals.szUtmpDir, NULL, NULL, 0}, {"wtmp directory", P_STRING, P_GLOBAL, &Globals.szWtmpDir, NULL, NULL, 0}, - {"utmp hostname", P_STRING, P_GLOBAL, &Globals.szUtmpHostname, NULL, NULL, 0}, {"utmp", P_BOOL, P_GLOBAL, &Globals.bUtmp, NULL, NULL, 0}, #endif @@ -1193,7 +1187,6 @@ static void init_globals(void) #ifdef WITH_UTMP string_set(&Globals.szUtmpDir, ""); string_set(&Globals.szWtmpDir, ""); - string_set(&Globals.szUtmpHostname, "%m"); Globals.bUtmp = False; #endif string_set(&Globals.szSocketAddress, "0.0.0.0"); @@ -1436,7 +1429,6 @@ FN_GLOBAL_STRING(lp_lockdir, &Globals.szLockDir) #ifdef WITH_UTMP FN_GLOBAL_STRING(lp_utmpdir, &Globals.szUtmpDir) FN_GLOBAL_STRING(lp_wtmpdir, &Globals.szWtmpDir) -FN_GLOBAL_STRING(lp_utmp_hostname, &Globals.szUtmpHostname) FN_GLOBAL_BOOL(lp_utmp, &Globals.bUtmp) #endif FN_GLOBAL_STRING(lp_rootdir, &Globals.szRootdir) @@ -1643,7 +1635,6 @@ FN_LOCAL_BOOL(lp_casesensitive, bCaseSensitive) FN_LOCAL_BOOL(lp_preservecase, bCasePreserve) FN_LOCAL_BOOL(lp_shortpreservecase, bShortCasePreserve) FN_LOCAL_BOOL(lp_casemangle, bCaseMangle) -FN_LOCAL_BOOL(lp_status, status) FN_LOCAL_BOOL(lp_hide_dot_files, bHideDotFiles) FN_LOCAL_BOOL(lp_hideunreadable, bHideUnReadable) FN_LOCAL_BOOL(lp_browseable, bBrowseable) @@ -1883,7 +1874,6 @@ static BOOL lp_add_ipc(char *ipc_name, BOOL guest_ok) string_set(&ServicePtrs[i]->szUsername, ""); string_set(&ServicePtrs[i]->comment, comment); string_set(&ServicePtrs[i]->fstype, "IPC"); - ServicePtrs[i]->status = False; ServicePtrs[i]->iMaxConnections = 0; ServicePtrs[i]->bAvailable = True; ServicePtrs[i]->bRead_only = True; diff --git a/source/smbd/reply.c b/source/smbd/reply.c index bef1b150847..b4fb6693e62 100644 --- a/source/smbd/reply.c +++ b/source/smbd/reply.c @@ -127,9 +127,7 @@ int reply_special(char *inbuf,char *outbuf) reload_services(True); reopen_logs(); - if (lp_status(-1)) { - claim_connection(NULL,"",MAXSTATUS,True); - } + claim_connection(NULL,"",MAXSTATUS,True); break; diff --git a/source/smbd/server.c b/source/smbd/server.c index 13071a5b65b..5bcb47393a6 100644 --- a/source/smbd/server.c +++ b/source/smbd/server.c @@ -459,9 +459,7 @@ void exit_server(char *reason) invalidate_all_vuids(); /* delete our entry in the connections database. */ - if (lp_status(-1)) { - yield_connection(NULL,"",MAXSTATUS); - } + yield_connection(NULL,"",MAXSTATUS); respond_to_all_remaining_local_messages(); decrement_smbd_process_count(); @@ -751,9 +749,7 @@ static void usage(char *pname) } /* Setup the main smbd so that we can get messages. */ - if (lp_status(-1)) { - claim_connection(NULL,"",MAXSTATUS,True); - } + claim_connection(NULL,"",MAXSTATUS,True); /* Attempt to migrate from an old 2.0.x machine account file. */ if (!migrate_from_old_password_file(global_myworkgroup)) { diff --git a/source/smbd/session.c b/source/smbd/session.c index 7616689fe0c..78c635d7cf0 100644 --- a/source/smbd/session.c +++ b/source/smbd/session.c @@ -28,17 +28,9 @@ #include "includes.h" -#if defined(WITH_PAM) || defined(WITH_UTMP) +extern fstring remote_machine; static TDB_CONTEXT *tdb; -struct sessionid { - fstring username; - fstring hostname; - fstring id_str; - uint32 id_num; - uint32 pid; -}; - /* called when a session is created */ BOOL session_claim(uint16 vuid) { @@ -98,6 +90,10 @@ BOOL session_claim(uint16 vuid) slprintf(sessionid.id_str, sizeof(sessionid.id_str)-1, SESSION_TEMPLATE, i); sessionid.id_num = i; sessionid.pid = pid; + sessionid.uid = vuser->uid; + sessionid.gid = vuser->gid; + fstrcpy(sessionid.remote_machine, remote_machine); + fstrcpy(sessionid.ip_addr, client_addr()); if (!smb_pam_claim_session(sessionid.username, sessionid.id_str, sessionid.hostname)) { DEBUG(1,("pam_session rejected the session for %s [%s]\n", @@ -106,12 +102,8 @@ BOOL session_claim(uint16 vuid) return False; } - dlen = tdb_pack(dbuf, sizeof(dbuf), "fffdd", - sessionid.username, sessionid.hostname, sessionid.id_str, - sessionid.id_num, sessionid.pid); - - data.dptr = dbuf; - data.dsize = dlen; + data.dptr = (char *)&sessionid; + data.dsize = sizeof(sessionid); if (tdb_store(tdb, key, data, TDB_MODIFY) != 0) { DEBUG(1,("session_claim: unable to create session id record\n")); return False; @@ -132,7 +124,7 @@ BOOL session_claim(uint16 vuid) void session_yield(uint16 vuid) { user_struct *vuser = get_valid_user_struct(vuid); - TDB_DATA data; + TDB_DATA dbuf; struct sessionid sessionid; TDB_DATA key; fstring keystr; @@ -148,17 +140,15 @@ void session_yield(uint16 vuid) key.dptr = keystr; key.dsize = strlen(keystr)+1; - data = tdb_fetch(tdb, key); - if (data.dptr == NULL) { + dbuf = tdb_fetch(tdb, key); + + if (dbuf.dsize != sizeof(sessionid)) return; - } - tdb_unpack(data.dptr, data.dsize, "fffdd", - &sessionid.username, &sessionid.hostname, &sessionid.id_str, - &sessionid.id_num, &sessionid.pid); + memcpy(&sessionid, dbuf.dptr, sizeof(sessionid)); - safe_free(data.dptr); - data.dptr = NULL; + safe_free(dbuf.dptr); + dbuf.dptr = NULL; #if WITH_UTMP if (lp_utmp()) { @@ -172,8 +162,3 @@ void session_yield(uint16 vuid) tdb_delete(tdb, key); } -#else - /* null functions - no session support needed */ - BOOL session_claim(uint16 vuid) { return True; } - void session_yield(uint16 vuid) {} -#endif diff --git a/source/utils/status.c b/source/utils/status.c index e5beb6403c8..36de6858f10 100644 --- a/source/utils/status.c +++ b/source/utils/status.c @@ -198,41 +198,33 @@ static int traverse_fn1(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *st return 0; } - if (brief) { - ptr=srecs; - while (ptr!=NULL) { - if ((ptr->pid==crec.pid)&&(strncmp(ptr->machine,crec.machine,30)==0)) { - if (ptr->start > crec.start) - ptr->start=crec.start; - break; - } - ptr=ptr->next; - } - if (ptr==NULL) { - ptr=(struct session_record *) malloc(sizeof(struct session_record)); - ptr->uid=crec.uid; - ptr->pid=crec.pid; - ptr->start=crec.start; - strncpy(ptr->machine,crec.machine,30); - ptr->machine[30]='\0'; - ptr->next=srecs; - srecs=ptr; - } - } else { - Ucrit_addPid(crec.pid); - if (processes_only) { - if (last_pid != crec.pid) - printf("%d\n",(int)crec.pid); - last_pid = crec.pid; /* XXXX we can still get repeats, have to - add a sort at some time */ - } else { - printf("%-10.10s %-8s %-8s %5d %-8s (%s) %s", - crec.name,uidtoname(crec.uid),gidtoname(crec.gid),(int)crec.pid, - crec.machine,crec.addr, - asctime(LocalTime(&crec.start))); - } + printf("%-10.10s %5d %-12s %s", + crec.name,(int)crec.pid, + crec.machine, + asctime(LocalTime(&crec.start))); + + return 0; +} + +static int traverse_sessionid(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *state) +{ + static pid_t last_pid; + struct session_record *ptr; + struct sessionid sessionid; + + if (dbuf.dsize != sizeof(sessionid)) + return 0; + + memcpy(&sessionid, dbuf.dptr, sizeof(sessionid)); + + if (!process_exists(sessionid.pid) || !Ucrit_checkUsername(uidtoname(sessionid.uid))) { + return 0; } + printf("%5d %-12s %-12s %-12s (%s)\n", + (int)sessionid.pid, uidtoname(sessionid.uid), gidtoname(sessionid.gid), + sessionid.remote_machine, sessionid.hostname); + return 0; } @@ -316,46 +308,38 @@ static int traverse_fn1(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *st return profile_dump(); } + tdb = tdb_open_log(lock_path("sessionid.tdb"), 0, USE_TDB_MMAP_FLAG, O_RDONLY, 0); + if (!tdb) { + printf("sessionid.tdb not initialised\n"); + } + + if (locks_only) goto locks; + + printf("\nSamba version %s\n",VERSION); + printf("PID Username Group Machine \n"); + printf("-------------------------------------------------------------------\n"); + + tdb_traverse(tdb, traverse_sessionid, NULL); + tdb_close(tdb); + tdb = tdb_open_log(lock_path("connections.tdb"), 0, USE_TDB_MMAP_FLAG, O_RDONLY, 0); if (!tdb) { printf("connections.tdb not initialised\n"); - if (!lp_status(-1)) - printf("You need to have status=yes in your smb config file\n"); - return(0); } else if (verbose) { printf("Opened status file %s\n", fname); } - if (locks_only) goto locks; + if (brief) + exit(0); + + printf("\nService pid machine Connected at\n"); + printf("-------------------------------------------------------\n"); - printf("\nSamba version %s\n",VERSION); - if (brief) { - printf("PID Username Machine Time logged in\n"); - printf("-------------------------------------------------------------------\n"); - } else { - printf("Service uid gid pid machine\n"); - printf("----------------------------------------------\n"); - } tdb_traverse(tdb, traverse_fn1, NULL); tdb_close(tdb); locks: if (processes_only) exit(0); - - if (brief) { - ptr=srecs; - while (ptr!=NULL) { - printf("%-8d%-10.10s%-30.30s%s", - (int)ptr->pid,uidtoname(ptr->uid), - ptr->machine, - asctime(LocalTime(&(ptr->start)))); - ptr=ptr->next; - } - printf("\n"); - exit(0); - } - - printf("\n"); if (!shares_only) { int ret; diff --git a/source/web/statuspage.c b/source/web/statuspage.c index dc26e86ef88..c112deb224a 100644 --- a/source/web/statuspage.c +++ b/source/web/statuspage.c @@ -209,9 +209,7 @@ void status_page(void) if (!tdb) { /* open failure either means no connections have been - made or status=no */ - if (!lp_status(-1)) - printf("You need to have status=yes in your smb config file\n"); + made */ } |