Corretta la gestione degli utenti e delle connessioni per la versione Terminal Server

git-svn-id: svn://10.65.10.50/trunk@11929 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 2004-04-01 08:42:27 +00:00
parent cc71815c08
commit ea3dafd100
2 changed files with 108 additions and 26 deletions

View File

@ -31,27 +31,43 @@ TUserInfo::TUserInfo(const wxChar* user, const wxChar* host)
class TUserTable : public wxObject
{
wxHashTable m_Hash;
public:
TUserInfo* AddConnection(wxSocketBase& sock, const wxChar* user);
TUserInfo* Find(wxSocketBase& sock, const wxChar* user);
void RemoveConnection(wxSocketBase& sock, const wxChar* user);
TUserInfo* AddConnection(wxSocketBase& sock, const wxChar* user, int session);
TUserInfo* Find(wxSocketBase& sock, const wxChar* user, int session);
void RemoveConnection(wxSocketBase& sock, const wxChar* user, int session);
void Kill(const wxChar* user);
size_t GetCount() const { return m_Hash.GetCount(); }
size_t GetLicenses();
void BeginFind() { m_Hash.BeginFind(); }
TUserInfo* Next() { wxNode* n = m_Hash.Next(); return n ? (TUserInfo*)n->GetData() : NULL; }
TUserTable(size_t size = 13);
};
TUserInfo* TUserTable::AddConnection(wxSocketBase& sock, const wxChar* user)
size_t TUserTable::GetLicenses()
{
TUserInfo* ui = Find(sock, user);
wxHashTable Hosts;
BeginFind();
for (TUserInfo* ui = Next(); ui; ui = Next())
if (Hosts.Get(ui->m_strHost) == NULL)
Hosts.Put(ui->m_strHost, ui);
return Hosts.GetCount();
}
TUserInfo* TUserTable::AddConnection(wxSocketBase& sock, const wxChar* user, int session)
{
TUserInfo* ui = Find(sock, user, session);
if (ui == NULL)
{
wxIPV4address peer; sock.GetPeer(peer);
const wxString host = peer.Hostname();
wxString host;
host = wxString::Format("%s:%d", (const char *) peer.Hostname(), session);
ui = new TUserInfo(user, host);
m_Hash.Put(wxString::Format("%s@%s", (const char *) user, host.c_str()), ui);
}
@ -60,10 +76,12 @@ TUserInfo* TUserTable::AddConnection(wxSocketBase& sock, const wxChar* user)
return ui;
}
TUserInfo* TUserTable::Find(wxSocketBase& sock, const wxChar* user)
TUserInfo* TUserTable::Find(wxSocketBase& sock, const wxChar* user, int session)
{
wxIPV4address peer; sock.GetPeer(peer);
const wxString host = peer.Hostname();
wxString host;
host = wxString::Format("%s:%d", (const char *) peer.Hostname(), session);
if (user && *user)
return (TUserInfo*)m_Hash.Get(wxString::Format("%s@%s", (const char *) user, host.c_str()));
@ -78,9 +96,9 @@ TUserInfo* TUserTable::Find(wxSocketBase& sock, const wxChar* user)
return NULL;
}
void TUserTable::RemoveConnection(wxSocketBase& sock, const wxChar* user)
void TUserTable::RemoveConnection(wxSocketBase& sock, const wxChar* user, int session)
{
TUserInfo* ui = Find(sock, user);
TUserInfo* ui = Find(sock, user, session);
if (ui)
{
ui->m_nPrograms--;
@ -299,6 +317,11 @@ void TAuthorizationServer::GenerateIndex(wxString& strFilename)
au.SetAttr("href", "Users.htm"); au << "Active Users";
AddNumber(tr3, m_Users.GetCount());
TXmlItem& tr3a = body.AddChild("tr");
TXmlItem& lu = tr3a.AddChild("td").AddChild("a");
lu << "Active Licenses";
AddNumber(tr3a, m_Users.GetLicenses());
TXmlItem& tr4 = body.AddChild("tr");
TXmlItem& am = tr4.AddChild("td").AddChild("a");
am.SetAttr("href", "Modules.htm"); am << "Active Modules";
@ -749,21 +772,25 @@ void TAuthorizationServer::ProcessUserLogin(wxString cmd, wxSocketBase& sock)
wxChar strUser[16];
wxChar strPassword[16];
wxChar strProgram[16];
int session;
cmd.Replace(",", " "); cmd.Replace(")", " ");
sscanf(cmd, "UserLogin(%s %s %s)", strUser, strPassword, strProgram);
const int nStr = sscanf(cmd, "UserLogin(%s %s %s %d)", strUser, strPassword, strProgram, &session);
if (nStr < 4)
session = 0;
unsigned int num = 0;
if (m_Dongle.Connected())
{
// Preliminary GUEST login
if (wxStricmp(strUser,"******")==0 && wxStricmp(strProgram, "ba0100")==0)
// Preliminary GUEST login
// if (wxStricmp(strUser,"******")==0 && wxStricmp(strProgram, "ba0100")==0)
// {
// num = 1;
// }
// else
{
num = 1;
}
else
{
if (m_Users.GetCount() >= m_Dongle.MaxUsers() && m_Users.Find(sock, strUser) == NULL)
if (m_Users.GetLicenses() >= m_Dongle.MaxUsers() && m_Users.Find(sock, strUser, session) == NULL)
{
WriteLog("*** Maximum users exceeded");
num = 0;
@ -775,7 +802,7 @@ void TAuthorizationServer::ProcessUserLogin(wxString cmd, wxSocketBase& sock)
else
num = DecodePassword(strPassword, strProgram);
if (num > 0)
m_Users.AddConnection(sock, strUser);
m_Users.AddConnection(sock, strUser, session);
else
WriteLog("*** Bad password");
}
@ -789,13 +816,17 @@ void TAuthorizationServer::ProcessUserLogin(wxString cmd, wxSocketBase& sock)
bool TAuthorizationServer::ProcessUserLogout(wxString cmd, wxSocketBase& sock)
{
const int a = cmd.Find('(')+1;
const int c = cmd.Find(')');
if (c > a)
{
const wxString strUser = cmd.Mid(a, c-a);
m_Users.RemoveConnection(sock, strUser);
}
wxChar strUser[16];
int session;
cmd.Replace(",", " "); cmd.Replace(")", " ");
const int nStr = sscanf(cmd, "UserLogout(%s %d)", strUser, &session);
if (nStr < 2)
session = 0;
m_Users.RemoveConnection(sock, strUser, session);
return true;
}

51
server/lerchd Executable file
View File

@ -0,0 +1,51 @@
#! /bin/sh
. /etc/rc.status
rc_reset
LERCH_BIN="/home/alex/a_02_00/exed/servers/lerch"
LERCH_PID="/var/run/lerch.pid"
case "$1" in
start)
echo -n "Starting lerch "
checkproc -p ${LERCH_PID} ${LERCH_BIN}
case $? in
0) echo -n "- Warning: lerch already running! " ;;
1) echo -n "- Warning: ${LERCH_PID} exists! " ;;
esac
startproc -p ${LERCH_PID} ${LERCH_BIN} }
rc_status -v
;;
stop)
echo -n "Shutting down lerch "
checkproc -p ${LERCH_PID} ${LERCH_BIN} || echo -n "- Warning: named not running! "
killproc -p ${LERCH_PID} -TERM ${LERCH_BIN}
rc_status -v
;;
try-restart)
$0 status >/dev/null && $0 restart
rc_status
;;
restart)
$0 stop
$0 start
rc_status
;;
force-reload)
$0 reload
rc_status
;;
status)
echo -n "Checking for lerch "
checkproc -p ${LERCH_PID} ${LERCH_BIN}
rc_status -v
;;
*)
echo "Usage: $0 {start|stop|status|try-restart|force-reload|reload}"
exit 1
;;
esac
rc_exit