git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@213 0109f412-320b-0410-ab79-c3e0c5ffbbe6
675 lines
16 KiB
C++
675 lines
16 KiB
C++
//-------------------------------------------------------------------------
|
|
// Desc: Factory class for pages created to do HTTP monitoring.
|
|
// Tabs: 3
|
|
//
|
|
// Copyright (c) 2001-2006 Novell, Inc. All Rights Reserved.
|
|
//
|
|
// This program is free software; you can redistribute it and/or
|
|
// modify it under the terms of version 2 of the GNU General Public
|
|
// License as published by the Free Software Foundation.
|
|
//
|
|
// 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, contact Novell, Inc.
|
|
//
|
|
// To contact Novell about this file by physical or electronic mail,
|
|
// you may find current contact information at www.novell.com
|
|
//
|
|
// $Id: imonfact.cpp 12329 2006-01-20 17:49:30 -0700 (Fri, 20 Jan 2006) ahodgkinson $
|
|
//-------------------------------------------------------------------------
|
|
|
|
#include "flaimsys.h"
|
|
|
|
/****************************************************************************
|
|
Desc: Procedure to instantiate a new WebPage object given a text string
|
|
****************************************************************************/
|
|
RCODE F_WebPageFactory::create(
|
|
const char * pszName,
|
|
F_WebPage ** ppPage,
|
|
HRequest * pHRequest)
|
|
{
|
|
RCODE rc = FERR_OK;
|
|
void * pvSession = NULL;
|
|
void * pvUser = NULL;
|
|
ACQUIRE_SESSION_FN fnAcquireSession =
|
|
gv_FlmSysData.HttpConfigParms.fnAcquireSession;
|
|
ACQUIRE_USER_FN fnAcquireUser =
|
|
gv_FlmSysData.HttpConfigParms.fnAcquireUser;
|
|
|
|
flmAssert( ppPage);
|
|
|
|
// Get the session for this user.
|
|
if (fnAcquireSession)
|
|
{
|
|
if ((pvSession = fnAcquireSession( pHRequest)) == NULL)
|
|
{
|
|
rc = RC_SET( FERR_FAILURE); // We should expect to succeed here.
|
|
goto Exit;
|
|
}
|
|
}
|
|
|
|
// Get the current user ...
|
|
if (fnAcquireUser)
|
|
{
|
|
if ((pvUser = fnAcquireUser( pvSession, pHRequest)) == NULL)
|
|
{
|
|
rc = RC_SET( FERR_FAILURE);
|
|
goto Exit;
|
|
}
|
|
}
|
|
|
|
|
|
// Are we being asked for the 'home page'?
|
|
if (*pszName == '\0')
|
|
{
|
|
if( (*ppPage= m_fnDefault()) == NULL)
|
|
{
|
|
rc = RC_SET( FERR_MEM);
|
|
goto Exit;
|
|
}
|
|
}
|
|
else // search the registry
|
|
{
|
|
FLMINT iEntryNum = searchRegistry ( pszName);
|
|
if (iEntryNum == -1)
|
|
{
|
|
if ( (*ppPage = m_fnError()) == NULL)
|
|
{
|
|
rc = RC_SET( FERR_MEM);
|
|
goto Exit;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Check for a secure page. Ignore it if we don't have any session info.
|
|
if (pvSession && isSecurePage( iEntryNum))
|
|
{
|
|
|
|
// Make sure:
|
|
// 1) Security is enable and not expired.
|
|
// 2) The user has entered the secure password in the Nav bar.
|
|
|
|
if ( isSecureAccessEnabled())
|
|
{
|
|
|
|
if ( isSecurePasswordEntered( pvSession))
|
|
{
|
|
if( (*ppPage = m_Registry[iEntryNum].fnCreate()) == NULL)
|
|
{
|
|
rc = RC_SET( FERR_MEM);
|
|
goto Exit;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Return an error page
|
|
if ( (*ppPage = m_fnSessionAccess()) == NULL)
|
|
{
|
|
rc = RC_SET( FERR_MEM);
|
|
goto Exit;
|
|
}
|
|
}
|
|
}
|
|
else if ( (*ppPage = m_fnGblAccess()) == NULL)
|
|
{
|
|
rc = RC_SET( FERR_MEM);
|
|
goto Exit;
|
|
}
|
|
}
|
|
else if( (*ppPage = m_Registry[iEntryNum].fnCreate()) == NULL)
|
|
{
|
|
rc = RC_SET( FERR_MEM);
|
|
goto Exit;
|
|
}
|
|
}
|
|
}
|
|
|
|
Exit:
|
|
|
|
if (pvSession)
|
|
{
|
|
gv_FlmSysData.HttpConfigParms.fnReleaseSession( pvSession);
|
|
}
|
|
|
|
if (pvUser)
|
|
{
|
|
gv_FlmSysData.HttpConfigParms.fnReleaseUser( pvUser);
|
|
}
|
|
|
|
return( rc);
|
|
}
|
|
|
|
|
|
/****************************************************************************
|
|
Desc: Tells the factory that the WebPage object is no longer needed
|
|
****************************************************************************/
|
|
void F_WebPageFactory::Release(
|
|
F_WebPage ** ppPage)
|
|
{
|
|
if (ppPage && *ppPage)
|
|
{
|
|
(*ppPage)->releaseSession();
|
|
(*ppPage)->Release();
|
|
*ppPage = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
/****************************************************************************
|
|
Desc: Takes the entries in the registry and sorts them on the name field
|
|
(We do this because we don't trust programmers to spell or
|
|
alphabetize..:)
|
|
****************************************************************************/
|
|
void F_WebPageFactory::sortRegistry()
|
|
{
|
|
// We're going to use an insertion-sort algorithm here because it's simple
|
|
// and has good performance for stuff that is already sorted or 'mostly'
|
|
// sorted.
|
|
|
|
FLMUINT uiInsertionPoint;
|
|
FLMUINT uiCurrent;
|
|
|
|
// First - how many entries in tmp?
|
|
m_uiNumEntries=0;
|
|
while( m_Registry[m_uiNumEntries++].fnCreate != NULL)
|
|
{
|
|
;
|
|
}
|
|
m_uiNumEntries--; // The last entry in the array is NULL...
|
|
|
|
// Basic algorithm: As uiCurrent goes from 1 to m_uiNumEntries-1, examine
|
|
// the entries from 0 to uiCurrent-1 and place Nth entry in it's proper place.
|
|
// (We'll use m_Registry[uiNumEntries] as a temporary holding spot.
|
|
// Clever, eh?)
|
|
|
|
for (uiCurrent = 1; uiCurrent < m_uiNumEntries; uiCurrent++)
|
|
{
|
|
uiInsertionPoint = uiCurrent;
|
|
while( (f_strcmp( m_Registry[uiCurrent].pszName,
|
|
m_Registry[uiInsertionPoint-1].pszName) < 0) &&
|
|
(uiInsertionPoint > 0) )
|
|
{
|
|
uiInsertionPoint--;
|
|
}
|
|
|
|
if (uiInsertionPoint < uiCurrent)
|
|
{
|
|
// Copy the entry at uiCurrent to temp space...
|
|
f_memcpy( &m_Registry[m_uiNumEntries], &m_Registry[uiCurrent],
|
|
sizeof( RegistryEntry));
|
|
|
|
// Move the appropriate entries up
|
|
f_memmove( &m_Registry[uiInsertionPoint + 1],
|
|
&m_Registry[uiInsertionPoint],
|
|
(uiCurrent-uiInsertionPoint) * sizeof( RegistryEntry));
|
|
|
|
//Copy the stuff in tmp to its sorted position...
|
|
f_memcpy( &m_Registry[uiInsertionPoint], &m_Registry[m_uiNumEntries],
|
|
sizeof( RegistryEntry));
|
|
}
|
|
}
|
|
|
|
//Reset the entry that we've been using for tmp storage
|
|
f_memset( &m_Registry[m_uiNumEntries], 0, sizeof( RegistryEntry));
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc: Returns the index into m_pRegistry for pszName, -1 if pszName is
|
|
not in m_pRegistry (Uses a binary search, so make sure the
|
|
registry is in sorted order!)
|
|
****************************************************************************/
|
|
FLMINT F_WebPageFactory::searchRegistry (
|
|
const char * pszName)
|
|
{
|
|
FLMBOOL bFound = FALSE;
|
|
#define MAX_LEN 100
|
|
char szPath[ MAX_LEN];
|
|
char * pszFirstSlash;
|
|
FLMUINT uiLow;
|
|
FLMUINT uiHigh;
|
|
FLMUINT uiTblSize;
|
|
FLMUINT uiMid;
|
|
FLMINT iCmp;
|
|
|
|
// We only want the part of the string up to the first '/'. Anything
|
|
// after that will be handled by the web page itself...
|
|
|
|
pszFirstSlash = f_strchr( pszName, '/');
|
|
|
|
if (pszFirstSlash)
|
|
{
|
|
flmAssert( (pszFirstSlash - pszName) < MAX_LEN);
|
|
f_strncpy( szPath, pszName, (pszFirstSlash - pszName));
|
|
szPath[pszFirstSlash-pszName] = '\0';
|
|
}
|
|
else
|
|
{
|
|
flmAssert( f_strlen( pszName) < MAX_LEN);
|
|
f_strcpy( szPath, pszName);
|
|
}
|
|
|
|
uiLow = 0;
|
|
uiHigh = uiTblSize = m_uiNumEntries-1;
|
|
for (;;)
|
|
{
|
|
uiMid = (uiLow + uiHigh) / 2;
|
|
iCmp = f_strcmp( szPath, m_Registry[uiMid].pszName);
|
|
|
|
if (iCmp == 0)
|
|
{
|
|
// Found Match
|
|
bFound = TRUE;
|
|
break;
|
|
}
|
|
|
|
// Check if we are done
|
|
if (uiLow >= uiHigh)
|
|
{
|
|
// Done, item not found
|
|
break;
|
|
}
|
|
|
|
if (iCmp < 0)
|
|
{
|
|
if (uiMid == 0)
|
|
{
|
|
break;
|
|
}
|
|
uiHigh = uiMid - 1;
|
|
}
|
|
else
|
|
{
|
|
if (uiMid == uiTblSize)
|
|
{
|
|
break;
|
|
}
|
|
uiLow = uiMid + 1;
|
|
}
|
|
}
|
|
|
|
return( bFound ? (FLMINT)uiMid : -1);
|
|
}
|
|
|
|
|
|
/******************************************************************
|
|
Desc: Function to test the Secure password has been entered for this
|
|
user. If it has, then it will be storted in the session under
|
|
the name defined by the constant FLM_SECURE_PASSWORD.
|
|
*******************************************************************/
|
|
FLMBOOL F_WebPageFactory::isSecurePasswordEntered(
|
|
void * pvSession)
|
|
{
|
|
GET_SESSION_VALUE_FN fnGetSessionValue =
|
|
gv_FlmSysData.HttpConfigParms.fnGetSessionValue;
|
|
char szData[ 21];
|
|
FLMUINT uiSize = sizeof( szData) - 1;
|
|
FLMBOOL bResult = FALSE;
|
|
|
|
flmAssert( fnGetSessionValue);
|
|
flmAssert( pvSession);
|
|
|
|
if (fnGetSessionValue( pvSession, FLM_SECURE_PASSWORD, (void *)szData,
|
|
(size_t *)&uiSize) == 0)
|
|
{
|
|
szData[ uiSize] = '\0';
|
|
bResult = isValidSecurePassword( szData);
|
|
}
|
|
|
|
return bResult;
|
|
}
|
|
|
|
|
|
/******************************************************************
|
|
Desc: Function to test if the secure password entered matches the
|
|
password stored globally.
|
|
*******************************************************************/
|
|
FLMBOOL F_WebPageFactory::isValidSecurePassword(
|
|
const char * pszData)
|
|
{
|
|
GET_GBL_VALUE_FN fnGetGblValue =
|
|
gv_FlmSysData.HttpConfigParms.fnGetGblValue;
|
|
char szPassword[21];
|
|
FLMUINT uiSize = sizeof( szPassword) -1;
|
|
FLMBOOL bResult = FALSE;
|
|
|
|
flmAssert( fnGetGblValue);
|
|
|
|
if (fnGetGblValue( FLM_SECURE_PASSWORD,
|
|
szPassword,
|
|
(size_t *)&uiSize) == 0)
|
|
{
|
|
szPassword[ uiSize] = '\0';
|
|
if (f_strcmp(pszData, szPassword) == 0)
|
|
{
|
|
bResult = TRUE;
|
|
}
|
|
}
|
|
|
|
return bResult;
|
|
}
|
|
|
|
/******************************************************************
|
|
Desc: Function to test if the secure password entered matches the
|
|
password stored globally. This function expects that the
|
|
expiration time will be a string representation of the
|
|
time (i.e. FLM_GET_TIMER + some duration).
|
|
*******************************************************************/
|
|
FLMBOOL F_WebPageFactory::isSecureAccessEnabled()
|
|
{
|
|
GET_GBL_VALUE_FN fnGetGblValue =
|
|
gv_FlmSysData.HttpConfigParms.fnGetGblValue;
|
|
char szExpiration[ 20];
|
|
FLMUINT uiExpSize = sizeof( szExpiration);
|
|
FLMUINT uiExpTime;
|
|
FLMUINT uiCurrTime;
|
|
FLMBOOL bResult = FALSE;
|
|
|
|
flmAssert( fnGetGblValue);
|
|
|
|
// Assuming that an error code will be returned if the global value
|
|
// has not been set.
|
|
if (fnGetGblValue( FLM_SECURE_EXPIRATION,
|
|
szExpiration,
|
|
(size_t *)&uiExpSize) == 0)
|
|
{
|
|
uiExpTime = f_atoud( szExpiration);
|
|
|
|
f_timeGetSeconds( &uiCurrTime);
|
|
|
|
if (uiCurrTime < uiExpTime)
|
|
{
|
|
bResult = TRUE;
|
|
}
|
|
}
|
|
|
|
return bResult;
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc: Each of these functions, when called, will create a new object of
|
|
a particular class. They are called by WebPageFactory::Create()
|
|
****************************************************************************/
|
|
static F_WebPage * createErrorPage()
|
|
{
|
|
return new F_ErrorPage;
|
|
}
|
|
|
|
static F_WebPage * createGblAccessPage()
|
|
{
|
|
return new F_GblAccessPage;
|
|
}
|
|
|
|
static F_WebPage * createSessionAccessPage()
|
|
{
|
|
return new F_SessionAccessPage;
|
|
}
|
|
|
|
static F_WebPage * createSCacheBlockPage()
|
|
{
|
|
return new F_SCacheBlockPage;
|
|
}
|
|
|
|
static F_WebPage * createSCacheHashTablePage()
|
|
{
|
|
return new F_SCacheHashTablePage;
|
|
}
|
|
|
|
static F_WebPage * createSCacheUseListPage()
|
|
{
|
|
return new F_SCacheUseListPage;
|
|
}
|
|
|
|
static F_WebPage * createSCacheNotifyListPage()
|
|
{
|
|
return new F_SCacheNotifyListPage;
|
|
}
|
|
|
|
static F_WebPage * createSCacheDataPage()
|
|
{
|
|
return new F_SCacheDataPage;
|
|
}
|
|
|
|
static F_WebPage * createSCacheMgrPage()
|
|
{
|
|
return new F_SCacheMgrPage;
|
|
}
|
|
|
|
static F_WebPage * createQueriesPage()
|
|
{
|
|
return new F_QueriesPage;
|
|
}
|
|
|
|
static F_WebPage * createQueryPage()
|
|
{
|
|
return new F_QueryPage;
|
|
}
|
|
|
|
static F_WebPage * createQueryStatsPage()
|
|
{
|
|
return new F_QueryStatsPage;
|
|
}
|
|
|
|
static F_WebPage * createSysConfigPage()
|
|
{
|
|
return new F_SysConfigPage;
|
|
}
|
|
|
|
static F_WebPage * createStatsPage()
|
|
{
|
|
return new F_StatsPage;
|
|
}
|
|
|
|
static F_WebPage * createFlmSysDataPage()
|
|
{
|
|
return new F_FlmSysDataPage;
|
|
}
|
|
|
|
static F_WebPage * createHttpConfigParmsPage()
|
|
{
|
|
return new F_HttpConfigParmsPage;
|
|
}
|
|
|
|
static F_WebPage * createFlmThreadsPage()
|
|
{
|
|
return new F_FlmThreadsPage;
|
|
}
|
|
|
|
static F_WebPage * createFlmIndexPage()
|
|
{
|
|
return new F_FlmIndexPage;
|
|
}
|
|
|
|
static F_WebPage * createIndexListPage()
|
|
{
|
|
return new F_IndexListPage;
|
|
}
|
|
|
|
static F_WebPage * createSelectPage()
|
|
{
|
|
return new F_SelectPage;
|
|
}
|
|
|
|
static F_WebPage * createCheckDbPage()
|
|
{
|
|
return new F_CheckDbPage;
|
|
}
|
|
|
|
static F_WebPage * serveFile()
|
|
{
|
|
return new F_HttpFile;
|
|
}
|
|
|
|
static F_WebPage * createDbBackupPage()
|
|
{
|
|
return new F_HttpDbBackup;
|
|
}
|
|
|
|
static F_WebPage * createFileHashTblPage()
|
|
{
|
|
return new F_FileHashTblPage;
|
|
}
|
|
|
|
static F_WebPage * createFFilePage()
|
|
{
|
|
return new F_FFilePage;
|
|
}
|
|
|
|
static F_WebPage * createFileHdlMgrPage()
|
|
{
|
|
return new F_FileHdlMgrPage;
|
|
}
|
|
|
|
static F_WebPage * createFileHdlPage()
|
|
{
|
|
return new F_FileHdlPage;
|
|
}
|
|
|
|
static F_WebPage * createFDBPage()
|
|
{
|
|
return new F_FDBPage;
|
|
}
|
|
|
|
static F_WebPage * createRCacheMgrPage()
|
|
{
|
|
return new F_RCacheMgrPage;
|
|
}
|
|
|
|
static F_WebPage * createRCachePage()
|
|
{
|
|
return new F_RCachePage;
|
|
}
|
|
|
|
static F_WebPage * createRecordMgrPage()
|
|
{
|
|
return new F_RecordMgrPage;
|
|
}
|
|
|
|
static F_WebPage * createRCHashBucketPage()
|
|
{
|
|
return new F_RCHashBucketPage;
|
|
}
|
|
|
|
// Frame pages
|
|
static F_WebPage * createHeaderFrame()
|
|
{
|
|
return new F_FrameHeader;
|
|
}
|
|
|
|
static F_WebPage * createMainFrame()
|
|
{
|
|
return new F_FrameMain;
|
|
}
|
|
|
|
static F_WebPage * createNavFrame()
|
|
{
|
|
return new F_FrameNav;
|
|
}
|
|
|
|
static F_WebPage * createWelcomeFrame()
|
|
{
|
|
return new F_FrameWelcome;
|
|
}
|
|
|
|
static F_WebPage * createSecureDbAccessPage()
|
|
{
|
|
return new F_SecureDbAccess;
|
|
}
|
|
|
|
static F_WebPage * createSecureDbInfoPage()
|
|
{
|
|
return new F_SecureDbInfo;
|
|
}
|
|
|
|
static F_WebPage * createServerLockMgrPage()
|
|
{
|
|
return new F_ServerLockMgrPage;
|
|
}
|
|
|
|
static F_WebPage * createDatabaseConfigPage()
|
|
{
|
|
return new F_DatabaseConfigPage;
|
|
}
|
|
|
|
static F_WebPage * createRCodeLookupPage()
|
|
{
|
|
return new F_RCodeLookupPage;
|
|
}
|
|
|
|
static F_WebPage * createDatabasePage()
|
|
{
|
|
return new F_DatabasePage;
|
|
}
|
|
|
|
static F_WebPage * createRecordPage()
|
|
{
|
|
return new F_RecordPage;
|
|
}
|
|
|
|
static F_WebPage * createProcessRecordPage()
|
|
{
|
|
return new F_ProcessRecordPage;
|
|
}
|
|
|
|
static F_WebPage * createLogHeaderPage()
|
|
{
|
|
return new F_LogHeaderPage;
|
|
}
|
|
|
|
// Initialize the static variables in the class...
|
|
CREATE_FN F_WebPageFactory::m_fnDefault = createMainFrame;
|
|
CREATE_FN F_WebPageFactory::m_fnError = createErrorPage;
|
|
CREATE_FN F_WebPageFactory::m_fnGblAccess = createGblAccessPage;
|
|
CREATE_FN F_WebPageFactory::m_fnSessionAccess = createSessionAccessPage;
|
|
|
|
RegistryEntry F_WebPageFactory::m_Registry[] = {
|
|
{"FDB", createFDBPage, FALSE},
|
|
{"FFile", createFFilePage, FALSE},
|
|
{"FileHashTbl", createFileHashTblPage, FALSE},
|
|
{"FileHdl", createFileHdlPage, FALSE},
|
|
{"FileHdlMgr", createFileHdlMgrPage, FALSE},
|
|
{"FlmSysData", createFlmSysDataPage, FALSE},
|
|
{"Header.htm", createHeaderFrame, FALSE},
|
|
{"HttpConfigParms", createHttpConfigParmsPage, FALSE},
|
|
{"LogHdr", createLogHeaderPage, FALSE},
|
|
{"Nav.htm", createNavFrame, FALSE},
|
|
{"ProcessRecord", createProcessRecordPage, TRUE},
|
|
{"Queries", createQueriesPage, FALSE},
|
|
{"Query", createQueryPage, FALSE},
|
|
{"QueryStats", createQueryStatsPage, FALSE},
|
|
{"RCHashBucket", createRCHashBucketPage, FALSE},
|
|
{"RCache", createRCachePage, FALSE},
|
|
{"RCacheMgr", createRCacheMgrPage, FALSE},
|
|
{"Record", createRecordPage, TRUE},
|
|
{"SCacheBlock", createSCacheBlockPage, FALSE},
|
|
{"SCacheData", createSCacheDataPage, TRUE},
|
|
{"SCacheHashTable", createSCacheHashTablePage, FALSE},
|
|
{"SCacheMgr", createSCacheMgrPage, FALSE},
|
|
{"SCacheNotifyList", createSCacheNotifyListPage, FALSE},
|
|
{"SCacheUseList", createSCacheUseListPage, FALSE},
|
|
{"SecureDbAccess", createSecureDbAccessPage, FALSE},
|
|
{"SecureDbInfo", createSecureDbInfoPage, FALSE},
|
|
{"ServerLockManager", createServerLockMgrPage, FALSE},
|
|
{"Stats", createStatsPage, FALSE},
|
|
{"SysConfig", createSysConfigPage, TRUE},
|
|
{"Welcome.htm", createWelcomeFrame, FALSE},
|
|
{"checkdb", createCheckDbPage, TRUE},
|
|
{"database", createDatabasePage, TRUE},
|
|
{"dbconfig", createDatabaseConfigPage, TRUE},
|
|
{"dbbackup", createDbBackupPage, TRUE},
|
|
{"file", serveFile, TRUE},
|
|
{"index", createFlmIndexPage, TRUE},
|
|
{"indexlist", createIndexListPage, TRUE},
|
|
{"returncode", createRCodeLookupPage, FALSE},
|
|
{"recordmgr", createRecordMgrPage, TRUE},
|
|
{"select", createSelectPage, TRUE},
|
|
{"staticfile", serveFile, FALSE},
|
|
{"threads", createFlmThreadsPage, TRUE},
|
|
{"", NULL, FALSE}
|
|
};
|
|
// WARNING: Make sure that every different WebPage class that you want to
|
|
// display is listed in the array above.
|