You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1544 lines
46 KiB
1544 lines
46 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation 1996-2001.
|
|
//
|
|
// File: command.cpp
|
|
//
|
|
// Contents: implementation of CComponentDataImpl
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
#include "stdafx.h"
|
|
#include "wrapper.h"
|
|
#include "snapmgr.h"
|
|
#include "asgncnfg.h"
|
|
#include "util.h"
|
|
#include <io.h>
|
|
#include <Dlgs.h>
|
|
|
|
static BOOL RecursiveCreateDirectory(
|
|
IN LPCTSTR pszDir
|
|
)
|
|
{
|
|
DWORD dwAttr;
|
|
DWORD dwErr;
|
|
LPCTSTR psz;
|
|
DWORD cch;
|
|
WCHAR wch;
|
|
LPTSTR pszParent = NULL;
|
|
BOOL fResult = FALSE;
|
|
|
|
dwAttr = GetFileAttributes(pszDir);
|
|
|
|
if (0xFFFFFFFF != dwAttr)
|
|
{
|
|
if (FILE_ATTRIBUTE_DIRECTORY & dwAttr)
|
|
fResult = TRUE;
|
|
goto CommonReturn;
|
|
}
|
|
|
|
dwErr = GetLastError();
|
|
if (!(ERROR_PATH_NOT_FOUND == dwErr || ERROR_FILE_NOT_FOUND == dwErr))
|
|
return FALSE;
|
|
|
|
//This is a safe usage. pszDir is a full path.
|
|
if (CreateDirectory(pszDir, NULL)) // lpSecurityAttributes
|
|
{
|
|
fResult = TRUE;
|
|
goto CommonReturn;
|
|
}
|
|
|
|
dwErr = GetLastError();
|
|
if (!(ERROR_PATH_NOT_FOUND == dwErr || ERROR_FILE_NOT_FOUND == dwErr))
|
|
goto CommonReturn;
|
|
|
|
// Peal off the last path name component
|
|
cch = _tcslen(pszDir);
|
|
psz = pszDir + cch;
|
|
|
|
while (TEXT('\\') != *psz)
|
|
{
|
|
if (psz == pszDir)
|
|
// Path didn't have a \.
|
|
goto CommonReturn;
|
|
psz--;
|
|
}
|
|
|
|
cch = (DWORD)(psz - pszDir);
|
|
if (0 == cch)
|
|
// Detected leading \Path
|
|
goto CommonReturn;
|
|
|
|
// Check for leading \\ or x:\.
|
|
wch = *(psz - 1);
|
|
if ((1 == cch && TEXT('\\') == wch) || (2 == cch && TEXT(':') == wch))
|
|
goto CommonReturn;
|
|
|
|
if (NULL == (pszParent = (LPWSTR) LocalAlloc(0, (cch + 1) * sizeof(WCHAR))))
|
|
goto CommonReturn;
|
|
//This may not be a safe usage, using TCHAR instead of WCHAR. Consider fix.
|
|
memcpy(pszParent, pszDir, cch * sizeof(TCHAR));
|
|
pszParent[cch] = TEXT('\0');
|
|
|
|
//This is a safe usage, pszParent is a full path.
|
|
if (!RecursiveCreateDirectory(pszParent))
|
|
goto CommonReturn;
|
|
if (!CreateDirectory(pszDir, NULL)) // lpSecurityAttributes
|
|
{
|
|
dwErr = GetLastError();
|
|
goto CommonReturn;
|
|
}
|
|
|
|
fResult = TRUE;
|
|
CommonReturn:
|
|
if (pszParent != NULL)
|
|
LocalFree(pszParent);
|
|
return fResult;
|
|
}
|
|
|
|
//+------------------------------------------------------------------------------------
|
|
// CComponentDataImpl::GetWorkingDir
|
|
//
|
|
// Gets the default or last set directory used for the uIDDir.
|
|
// Some defaults defined by this function are.
|
|
//
|
|
// %windir%\security\database - ANALYSIS
|
|
// %windir%\security\Templates - Default profile location.
|
|
//
|
|
// Arguments: [uIDDir] - The ID of the working directory to set or retrieve.
|
|
// [pStr] - Either the source or the return value. When the
|
|
// function returns this value will be set to a directory
|
|
// location.
|
|
//
|
|
// [bSet] - TRUE if [pStr] is to be set as the new working directory.
|
|
// [bFile] - [pStr] contains a file name.
|
|
//
|
|
// Returns: TRUE - If the function succees.
|
|
// FALSE - if something went wrong.
|
|
// We don't really need to much granularity because this is not a critical
|
|
// function.
|
|
//+------------------------------------------------------------------------------------
|
|
BOOL
|
|
CComponentDataImpl::GetWorkingDir(
|
|
GWD_TYPES uIDDir,
|
|
LPTSTR *pStr,
|
|
BOOL bSet,
|
|
BOOL bFile
|
|
)
|
|
{
|
|
BOOL fRet = FALSE;
|
|
|
|
if(!pStr)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
LPTSTR szLocationValue = NULL;
|
|
switch(uIDDir)
|
|
{
|
|
case GWD_CONFIGURE_LOG:
|
|
szLocationValue = CONFIGURE_LOG_LOCATIONS_KEY;
|
|
break;
|
|
case GWD_ANALYSIS_LOG:
|
|
szLocationValue = ANALYSIS_LOG_LOCATIONS_KEY;
|
|
break;
|
|
case GWD_OPEN_DATABASE:
|
|
szLocationValue = OPEN_DATABASE_LOCATIONS_KEY;
|
|
break;
|
|
case GWD_IMPORT_TEMPLATE:
|
|
szLocationValue = IMPORT_TEMPLATE_LOCATIONS_KEY;
|
|
break;
|
|
case GWD_EXPORT_TEMPLATE:
|
|
szLocationValue = IMPORT_TEMPLATE_LOCATIONS_KEY; //104152, yanggao, 3/21/2001
|
|
break;
|
|
}
|
|
|
|
|
|
LPTSTR pszPath = NULL;
|
|
int i = 0;
|
|
|
|
if( bSet )
|
|
{
|
|
if(!pStr || !(*pStr))
|
|
return FALSE;
|
|
|
|
i = lstrlen( *pStr );
|
|
if(bFile)
|
|
{
|
|
//
|
|
// Remove the file from the end of the string.
|
|
//
|
|
while(i && (*pStr)[i] != '\\')
|
|
i--;
|
|
}
|
|
|
|
//
|
|
// Create space for the new path and copy what we want.
|
|
//
|
|
pszPath = (LPTSTR)LocalAlloc( 0, (i + 1) * sizeof(TCHAR));
|
|
if(!pszPath)
|
|
return FALSE;
|
|
//This is a safe usage.
|
|
memcpy(pszPath, *pStr, (i * sizeof(TCHAR)));
|
|
pszPath[i] = 0;
|
|
|
|
MyRegSetValue(HKEY_CURRENT_USER,
|
|
DEFAULT_LOCATIONS_KEY,
|
|
szLocationValue,
|
|
(BYTE*)pszPath,
|
|
(i+1)*sizeof(TCHAR),
|
|
REG_SZ);
|
|
|
|
LocalFree(pszPath);
|
|
return TRUE;
|
|
}
|
|
|
|
DWORD dwType = REG_SZ;
|
|
if (MyRegQueryValue(HKEY_CURRENT_USER,
|
|
DEFAULT_LOCATIONS_KEY,
|
|
szLocationValue,
|
|
(PVOID*)&pszPath,
|
|
&dwType) == ERROR_SUCCESS)
|
|
{
|
|
*pStr = pszPath;
|
|
return TRUE;
|
|
}
|
|
|
|
CString sAppend;
|
|
DWORD dwRet;
|
|
pszPath = NULL;
|
|
|
|
switch ( uIDDir )
|
|
{
|
|
case GWD_CONFIGURE_LOG:
|
|
case GWD_ANALYSIS_LOG:
|
|
sAppend.LoadString(IDS_LOGFILE_DEFAULT);
|
|
// fall through
|
|
case GWD_OPEN_DATABASE:
|
|
//
|
|
// Used for open DB.
|
|
//
|
|
if (sAppend.IsEmpty())
|
|
{
|
|
sAppend.LoadString( IDS_DB_DEFAULT );
|
|
} // else fell through
|
|
|
|
|
|
//
|
|
// Default directory for analysis.
|
|
//
|
|
pszPath = (LPTSTR)LocalAlloc( 0, (MAX_PATH + sAppend.GetLength() + 1) * sizeof(TCHAR));
|
|
if (pszPath == NULL)
|
|
return FALSE;
|
|
|
|
if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, 0, pszPath)))
|
|
{
|
|
//This is a safe usage, yanggao.
|
|
lstrcpy( &(pszPath[lstrlen(pszPath)]), sAppend );
|
|
|
|
//
|
|
// Check to see if the directory does not exist, it may need
|
|
// to be created if this is the first time this user has
|
|
// opened a database.
|
|
//
|
|
TCHAR szTempFile[MAX_PATH];
|
|
CString str;
|
|
|
|
str.LoadString(IDS_TEMP_FILENAME);
|
|
if (!GetTempFileName(pszPath,str,0,szTempFile)) //This is not a safe usage. Raid #555912, yanggao.
|
|
{
|
|
if ((GetLastError() == ERROR_DIRECTORY) && (RecursiveCreateDirectory(pszPath)))
|
|
{
|
|
fRet = TRUE;
|
|
}
|
|
else
|
|
{
|
|
LocalFree(pszPath);
|
|
fRet = FALSE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DeleteFile(szTempFile);
|
|
fRet = TRUE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
LocalFree(pszPath);
|
|
pszPath = NULL;
|
|
}
|
|
break;
|
|
|
|
case GWD_IMPORT_TEMPLATE:
|
|
case GWD_EXPORT_TEMPLATE:
|
|
|
|
sAppend.LoadString( IDS_DEFAULT_TEMPLATE_DIR );
|
|
|
|
//
|
|
// Default directory for analysis.
|
|
//
|
|
dwRet = GetSystemWindowsDirectory( NULL, 0);
|
|
if (dwRet)
|
|
{
|
|
pszPath = (LPTSTR)LocalAlloc( 0, (dwRet + sAppend.GetLength() + 1) * sizeof(TCHAR));
|
|
if (!pszPath)
|
|
return FALSE;
|
|
|
|
GetSystemWindowsDirectory( pszPath, dwRet + 1);
|
|
//This is a safe usage, yanggao.
|
|
lstrcpy( &(pszPath[lstrlen(pszPath)]), sAppend );
|
|
|
|
i = lstrlen(pszPath);
|
|
|
|
//
|
|
// Make sure the user can write to this directory:
|
|
//
|
|
TCHAR szTempFile[MAX_PATH];
|
|
HANDLE hTempFile=NULL;
|
|
CString str;
|
|
|
|
str.LoadString(IDS_TEMP_FILENAME);
|
|
szTempFile[0] = L'\0';
|
|
if (GetTempFileName(pszPath,str,0,szTempFile)) //This is not a safe usage. Raid #555912, yanggao.
|
|
{
|
|
hTempFile = ExpandAndCreateFile(szTempFile,
|
|
GENERIC_READ|GENERIC_WRITE,
|
|
0,
|
|
NULL,
|
|
CREATE_NEW,
|
|
FILE_ATTRIBUTE_TEMPORARY,
|
|
NULL);
|
|
}
|
|
if (hTempFile)
|
|
{
|
|
//
|
|
// We have write access to this directory
|
|
//
|
|
::CloseHandle(hTempFile);
|
|
DeleteFile(szTempFile);
|
|
fRet = TRUE;
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// We don't have write access to this directory. Find another
|
|
// or we can't get a temp file name
|
|
//
|
|
LPTSTR szPath;
|
|
LPITEMIDLIST pidl;
|
|
LPMALLOC pMalloc;
|
|
|
|
//
|
|
// For some reason this won't compile with SHGetFolderPath()
|
|
// Therefore go the long way around and deal with the pidl.
|
|
//
|
|
if (NOERROR == SHGetSpecialFolderLocation(m_hwndParent,CSIDL_PERSONAL,&pidl))
|
|
{
|
|
if (SHGetPathFromIDList(pidl,szTempFile))
|
|
{
|
|
szPath = (LPTSTR)LocalAlloc(LPTR, (lstrlen(szTempFile)+ 1) * sizeof(TCHAR));
|
|
if (szPath)
|
|
{
|
|
//
|
|
// If we can't create a new path then use the old one so the user
|
|
// at least has a starting place to browse from
|
|
//
|
|
//This is a safe usage.
|
|
lstrcpy(szPath,szTempFile);
|
|
LocalFree(pszPath);
|
|
pszPath = szPath;
|
|
fRet = TRUE;
|
|
}
|
|
}
|
|
if (SUCCEEDED(SHGetMalloc(&pMalloc)))
|
|
{
|
|
pMalloc->Free(pidl);
|
|
pMalloc->Release();
|
|
}
|
|
}
|
|
//
|
|
// If we can't write here the user will have to browse for something
|
|
//
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
*pStr = pszPath;
|
|
return fRet;
|
|
}
|
|
|
|
UINT_PTR CALLBACK OFNHookProc(
|
|
HWND hdlg, // handle to child dialog box
|
|
UINT uiMsg, // message identifier
|
|
WPARAM wParam, // message parameter
|
|
LPARAM lParam // message parameter
|
|
)
|
|
{
|
|
|
|
if ( WM_NOTIFY == uiMsg )
|
|
{
|
|
OFNOTIFY* pOFNotify = (OFNOTIFY*) lParam;
|
|
if ( pOFNotify && CDN_FILEOK == pOFNotify->hdr.code )
|
|
{
|
|
//
|
|
// Don't accept filenames with DBCS characters that are greater then 255 in them
|
|
//
|
|
CString strErr;
|
|
CString strtemp;
|
|
long templen = wcslen(pOFNotify->lpOFN->lpstrDefExt) + 2;//Raid #533603, yanggao, 4/17/2002.
|
|
strtemp = pOFNotify->lpOFN->lpstrFile;
|
|
strErr = pOFNotify->lpOFN->lpstrDefExt;
|
|
if( L"\\."+ strErr == strtemp.Right(templen) || L"/."+strErr == strtemp.Right(templen) )
|
|
{
|
|
strErr.FormatMessage(IDS_INVALID_DBNAME, pOFNotify->lpOFN->lpstrFile, pOFNotify->lpOFN->lpstrDefExt);
|
|
AppMessageBox(NULL,strErr,NULL,MB_ICONSTOP|MB_OK);
|
|
SetFocus(GetDlgItem(GetParent(hdlg), cmb13));
|
|
::SetWindowLongPtr(hdlg, DWLP_MSGRESULT, TRUE);
|
|
return 1;
|
|
}
|
|
templen = wcslen(pOFNotify->lpOFN->lpstrFile); //Raid #401060
|
|
if( templen >= MAX_PATH || (templen-strtemp.ReverseFind(L'.'))-1 != wcslen(pOFNotify->lpOFN->lpstrDefExt) )
|
|
{
|
|
//This is a safe usage.
|
|
strErr.FormatMessage(IDS_DB_NAME_SPACE_NOT_ENOUGH, pOFNotify->lpOFN->lpstrFile);
|
|
strtemp.LoadString(IDS_PATH_TOO_LONG);
|
|
strErr = strErr + L"\n" + strtemp;
|
|
AppMessageBox(NULL,strErr,NULL,MB_ICONSTOP|MB_OK);
|
|
SetFocus(GetDlgItem(GetParent(hdlg), cmb13)); //Raid #502393.
|
|
::SetWindowLongPtr(hdlg, DWLP_MSGRESULT, TRUE);
|
|
return 1;
|
|
}
|
|
templen = templen - wcslen(pOFNotify->lpOFN->lpstrDefExt);
|
|
if( _wcsicmp(pOFNotify->lpOFN->lpstrFile+templen, pOFNotify->lpOFN->lpstrDefExt) != 0 )
|
|
{
|
|
//This is a safe usage.
|
|
strErr.FormatMessage(IDS_DB_NAME_SPACE_NOT_ENOUGH, pOFNotify->lpOFN->lpstrFile);
|
|
strtemp.LoadString(IDS_ERR_FILE_EXTENSION); //Raid #567739, yanggao, 4/4/2002.
|
|
strErr = strErr + L"\n" + strtemp;
|
|
AppMessageBox(NULL,strErr,NULL,MB_ICONSTOP|MB_OK);
|
|
SetFocus(GetDlgItem(GetParent(hdlg), cmb13)); //Raid #502393.
|
|
::SetWindowLongPtr(hdlg, DWLP_MSGRESULT, TRUE);
|
|
return 1;
|
|
}
|
|
|
|
//Raid #263854, 4/3/2001
|
|
BOOL ferr = TRUE;
|
|
// This is a safe usage. yanggao
|
|
if(WideCharToMultiByte(CP_ACP, 0, pOFNotify->lpOFN->lpstrFile,
|
|
-1, NULL, 0, NULL, &ferr))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
strErr.LoadString(IDS_NO_DBCS);
|
|
strErr += L"\r\n\r\n";
|
|
strErr += pOFNotify->lpOFN->lpstrFile;
|
|
AppMessageBox(NULL,strErr,NULL,MB_ICONSTOP|MB_OK);
|
|
|
|
::SetWindowLongPtr(hdlg, DWLP_MSGRESULT, TRUE);
|
|
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Method: OnOpenDataBase()
|
|
//
|
|
// Synopsis: Picks a new database for SAV to work on
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
HRESULT
|
|
CComponentDataImpl::OnOpenDataBase()
|
|
{
|
|
//
|
|
// Find the desired new database
|
|
//
|
|
CString strDefExtension;
|
|
CString strFilter;
|
|
CString strOfnTitle;
|
|
CString strDir;
|
|
|
|
strDefExtension.LoadString(IDS_DEFAULT_DB_EXTENSION);
|
|
strFilter.LoadString(IDS_DB_FILTER);
|
|
|
|
strOfnTitle.LoadString(IDS_OPEN_DB_OFN_TITLE);
|
|
|
|
LPTSTR pszDir = NULL;
|
|
//
|
|
// Build a working directory for this object,
|
|
//
|
|
if (GetWorkingDir( GWD_OPEN_DATABASE, &pszDir ) )
|
|
{
|
|
strDir = pszDir;
|
|
LocalFree(pszDir);
|
|
pszDir = NULL;
|
|
}
|
|
|
|
WCHAR szFile[MAX_PATH];
|
|
::ZeroMemory (szFile, MAX_PATH * sizeof(WCHAR));
|
|
OPENFILENAME ofn;
|
|
::ZeroMemory (&ofn, sizeof (OPENFILENAME));
|
|
|
|
ofn.lStructSize = sizeof (OPENFILENAME);
|
|
ofn.hwndOwner = m_hwndParent;
|
|
//HINSTANCE hInstance;
|
|
|
|
// Translate filter into commdlg format (lots of \0)
|
|
LPTSTR szFilter = strFilter.GetBuffer(0); // modify the buffer in place
|
|
// MFC delimits with '|' not '\0'
|
|
LPTSTR pch = szFilter;
|
|
while ((pch = _tcschr(pch, '|')) != NULL)
|
|
*pch++ = '\0';
|
|
// do not call ReleaseBuffer() since the string contains '\0' characters
|
|
ofn.lpstrFilter = szFilter;
|
|
ofn.lpstrFile = szFile;
|
|
ofn.nMaxFile = MAX_PATH; //Raid #567739, yanggao, 4/4/2002.
|
|
ofn.lpstrInitialDir = (PCWSTR) strDir;
|
|
ofn.lpstrTitle = strOfnTitle;
|
|
ofn.Flags = OFN_HIDEREADONLY| // Don't show the read only prompt
|
|
OFN_SHAREAWARE|
|
|
OFN_NOREADONLYRETURN|
|
|
OFN_EXPLORER | // Explorer style dialog;
|
|
OFN_DONTADDTORECENT|
|
|
OFN_ENABLEHOOK;
|
|
ofn.lpstrDefExt = (PCWSTR) strDefExtension;
|
|
ofn.lpfnHook = OFNHookProc;
|
|
|
|
if ( GetOpenFileName (&ofn) )
|
|
{
|
|
//
|
|
// Set the working directory of the database.
|
|
//
|
|
pszDir = szFile;
|
|
GetWorkingDir( GWD_OPEN_DATABASE, &pszDir, TRUE, TRUE );
|
|
if( IsSystemDatabase( ofn.lpstrFile /*fo.GetPathName()*/) )
|
|
{
|
|
AfxMessageBox( IDS_CANT_OPEN_SYSTEM_DB, MB_OK);
|
|
return S_FALSE;
|
|
}
|
|
SadName = ofn.lpstrFile; //fo.GetPathName();
|
|
SetErroredLogFile(NULL);
|
|
//
|
|
// If new database doesn't exist then ask for a configuration to import
|
|
//
|
|
|
|
DWORD dwAttr = GetFileAttributes(SadName);
|
|
|
|
if (0xFFFFFFFF == dwAttr)
|
|
{
|
|
SCESTATUS sceStatus = SCESTATUS_SUCCESS;
|
|
//
|
|
// New database, so assign a configuration
|
|
//
|
|
if( OnAssignConfiguration( &sceStatus ) == S_FALSE)
|
|
{
|
|
//
|
|
// If the user decides to cancel the import of a configuration, then,
|
|
// we need to unload the sad information and display the correct
|
|
// error message. Set the sad errored to PROFILE_NOT_FOUND so error,
|
|
// is correct. There is no need to call LoadSadinfo.
|
|
//
|
|
UnloadSadInfo();
|
|
if( sceStatus != SCESTATUS_SUCCESS )
|
|
SadErrored = sceStatus;
|
|
else
|
|
SadErrored = SCESTATUS_PROFILE_NOT_FOUND;
|
|
if(m_AnalFolder)
|
|
{
|
|
m_pConsole->SelectScopeItem(m_AnalFolder->GetScopeItem()->ID);
|
|
}
|
|
|
|
SadName.Empty(); //Raid #459576, Yang Gao, 8/29/2001
|
|
|
|
return S_OK;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Invalidiate currently open database
|
|
//
|
|
RefreshSadInfo();
|
|
return S_OK;
|
|
}
|
|
else
|
|
{
|
|
DWORD dwErr = CommDlgExtendedError();
|
|
}
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Method: OnNewDataBase()
|
|
//
|
|
// Synopsis: Picks a new database for SAV to work on
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
HRESULT
|
|
CComponentDataImpl::OnNewDatabase()
|
|
{
|
|
//
|
|
// Find the desired new database
|
|
//
|
|
CString strDefExtension;
|
|
CString strFilter;
|
|
CString strOfnTitle;
|
|
CWnd cwndParent;
|
|
|
|
strDefExtension.LoadString(IDS_DEFAULT_DB_EXTENSION);
|
|
strFilter.LoadString(IDS_DB_FILTER);
|
|
strOfnTitle.LoadString(IDS_NEW_DB_OFN_TITLE);
|
|
|
|
// Translate filter into commdlg format (lots of \0)
|
|
LPTSTR szFilter = strFilter.GetBuffer(0); // modify the buffer in place
|
|
LPTSTR pch = szFilter;
|
|
// MFC delimits with '|' not '\0'
|
|
while ((pch = _tcschr(pch, '|')) != NULL)
|
|
*pch++ = '\0';
|
|
// do not call ReleaseBuffer() since the string contains '\0' characters
|
|
|
|
OPENFILENAME ofn;
|
|
::ZeroMemory (&ofn, sizeof (OPENFILENAME));
|
|
ofn.lStructSize = sizeof(OPENFILENAME);
|
|
ofn.lpstrFilter = szFilter;
|
|
ofn.lpstrFile = SadName.GetBuffer(MAX_PATH);
|
|
ofn.nMaxFile = MAX_PATH;
|
|
ofn.lpstrDefExt = strDefExtension,
|
|
ofn.hwndOwner = m_hwndParent;
|
|
ofn.Flags = OFN_HIDEREADONLY |
|
|
OFN_SHAREAWARE |
|
|
OFN_EXPLORER |
|
|
OFN_DONTADDTORECENT;
|
|
ofn.lpstrTitle = strOfnTitle;
|
|
|
|
if (GetOpenFileName(&ofn))
|
|
{
|
|
PVOID pHandle = NULL;
|
|
|
|
SadName.ReleaseBuffer();
|
|
//
|
|
// If new database doesn't exist then ask for a configuration to import
|
|
//
|
|
DWORD dwAttr = GetFileAttributes(SadName);
|
|
|
|
if (0xFFFFFFFF == dwAttr)
|
|
{
|
|
//
|
|
// New database, so assign a configuration
|
|
//
|
|
SCESTATUS sceStatus;
|
|
OnAssignConfiguration(&sceStatus);
|
|
}
|
|
|
|
//
|
|
// Invalidiate currently open database
|
|
//
|
|
SetErroredLogFile(NULL);
|
|
RefreshSadInfo();
|
|
return S_OK;
|
|
}
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Method: OnAssignConfiguration()
|
|
//
|
|
// Synopsis: Assigns a configuration template to SAV's currently selected
|
|
// database
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
HRESULT
|
|
CComponentDataImpl::OnAssignConfiguration( SCESTATUS *pSceStatus )
|
|
{
|
|
|
|
//
|
|
//Currently pSceStatus is only used for passing back the error
|
|
//when user presses cancel on select template diaglog.
|
|
|
|
|
|
//
|
|
// Find the desired new database
|
|
//
|
|
CString strDefExtension; // Default extension
|
|
CString strCurFile;
|
|
CString strFilter; // Extension filter
|
|
CString strOfnTitle;
|
|
CWnd cwndParent;
|
|
BOOL bIncremental;
|
|
SCESTATUS status;
|
|
HKEY hKey; // HKEY of TemplateUsed.
|
|
DWORD dwBufSize = 0; // Size of szTemplateUsed in bytes
|
|
DWORD dwType = 0; // Type of registry item, return by query
|
|
DWORD dwStatus;
|
|
|
|
*pSceStatus = 0;
|
|
|
|
//
|
|
// Display a warning and give a chance to cancel
|
|
// if they try to configure a non-system database
|
|
//
|
|
if (IsSystemDatabase(SadName))
|
|
{
|
|
BOOL bImportAnyway;
|
|
|
|
bImportAnyway = AfxMessageBox(IDS_IMPORT_WARNING,MB_OKCANCEL);
|
|
if (IDCANCEL == bImportAnyway)
|
|
{
|
|
return S_FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
strDefExtension.LoadString(IDS_PROFILE_DEF_EXT);
|
|
strFilter.LoadString(IDS_PROFILE_FILTER);
|
|
strOfnTitle.LoadString(IDS_ASSIGN_CONFIG_OFN_TITLE);
|
|
|
|
//
|
|
// Get the last directory used by templates.
|
|
//
|
|
LPTSTR pszDir = NULL;
|
|
if(strCurFile.IsEmpty())
|
|
{
|
|
if (GetWorkingDir( GWD_EXPORT_TEMPLATE, &pszDir ) )
|
|
{
|
|
strCurFile = pszDir;
|
|
LocalFree(pszDir);
|
|
pszDir = NULL;
|
|
}
|
|
}
|
|
strCurFile += TEXT("\\*.");
|
|
strCurFile += strDefExtension;
|
|
|
|
cwndParent.Attach(m_hwndParent);
|
|
CAssignConfiguration ac(TRUE, // File Open, not file save
|
|
strDefExtension, // Default Extension
|
|
strCurFile, // Initial File Name == current DB
|
|
OFN_HIDEREADONLY| // Don't show the read only prompt
|
|
OFN_EXPLORER| // Explorer style dialog
|
|
OFN_ENABLETEMPLATE| // custom template
|
|
OFN_SHAREAWARE| // We're not going to need exclusive
|
|
OFN_DONTADDTORECENT|
|
|
OFN_FILEMUSTEXIST, // The Template must exist for us to assign it. Raid #535787, yanggao.
|
|
strFilter, // Filter for allowed extensions
|
|
&cwndParent); // Dialog's Parent window
|
|
|
|
cwndParent.Detach();
|
|
|
|
ac.m_ofn.lpstrTitle = strOfnTitle.GetBuffer(1);
|
|
ac.m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_ASSIGN_CONFIG_CHECK);
|
|
if (IDOK == ac.DoModal())
|
|
{
|
|
CThemeContextActivator activator;
|
|
strCurFile = ac.GetPathName();
|
|
bIncremental = ac.m_bIncremental;
|
|
|
|
//
|
|
// Set the working dir to this file.
|
|
//
|
|
pszDir = strCurFile.GetBuffer(0);
|
|
GetWorkingDir( GWD_IMPORT_TEMPLATE, &pszDir, TRUE, TRUE);
|
|
strCurFile.ReleaseBuffer();
|
|
CWaitCursor wc;
|
|
|
|
//
|
|
// Unload the sad info before we choose to do an import.
|
|
//
|
|
UnloadSadInfo();
|
|
status = AssignTemplate(
|
|
strCurFile.IsEmpty() ? NULL:(LPCTSTR)strCurFile,
|
|
SadName,
|
|
bIncremental
|
|
);
|
|
|
|
if (SCESTATUS_SUCCESS != status)
|
|
{
|
|
CString strErr;
|
|
|
|
MyFormatResMessage(status,IDS_IMPORT_FAILED,NULL,strErr);
|
|
AfxMessageBox(strErr);
|
|
|
|
//
|
|
// We don't know if the database is still OK to read so open it anyways.
|
|
//
|
|
LoadSadInfo(TRUE);
|
|
if( SCESTATUS_SPECIAL_ACCOUNT == SadErrored )//Raid #589139, DCR, yanggao, 4/12/2002.
|
|
*pSceStatus = SadErrored;
|
|
return S_FALSE;
|
|
}
|
|
|
|
//remove RefreshSadInfo() because we can't do it two times. The second call will delete the file
|
|
//created by first call. Raid#668551, yanggao. 8/26/2002
|
|
return S_OK;
|
|
}
|
|
*pSceStatus = SCESTATUS_NO_TEMPLATE_GIVEN;
|
|
return S_FALSE;
|
|
|
|
}
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Method: OnSecureWizard()
|
|
//
|
|
// Synopsis: Launch the secure wizard (registered)
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
HRESULT
|
|
CComponentDataImpl::OnSecureWizard()
|
|
{
|
|
|
|
HRESULT hr=S_FALSE;
|
|
PWSTR pstrWizardName=NULL;
|
|
|
|
if ( GetSecureWizardName(&pstrWizardName, NULL) )
|
|
{
|
|
|
|
PROCESS_INFORMATION ProcInfo;
|
|
STARTUPINFO StartInfo;
|
|
BOOL fOk;
|
|
|
|
|
|
RtlZeroMemory(&StartInfo,sizeof(StartInfo));
|
|
StartInfo.cb = sizeof(StartInfo);
|
|
StartInfo.dwFlags = STARTF_USESHOWWINDOW;
|
|
StartInfo.wShowWindow = (WORD)SW_SHOWNORMAL;
|
|
//This is a safe usage if pstrWizardName is a full path for security wizard.
|
|
fOk = CreateProcess(pstrWizardName, NULL,
|
|
NULL, NULL, FALSE,
|
|
0,
|
|
NULL,
|
|
NULL,
|
|
&StartInfo,
|
|
&ProcInfo
|
|
);
|
|
|
|
if ( fOk )
|
|
{
|
|
::CloseHandle(ProcInfo.hProcess);
|
|
::CloseHandle(ProcInfo.hThread);
|
|
|
|
hr = S_OK;
|
|
}
|
|
|
|
LocalFree(pstrWizardName);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Method: OnSaveConfiguration()
|
|
//
|
|
// Synopsis: Saves the assigned computer template to an INF file
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
HRESULT
|
|
CComponentDataImpl::OnSaveConfiguration()
|
|
{
|
|
//
|
|
// Find the desired new database
|
|
//
|
|
CString strDefExtension;
|
|
CString strFilter;
|
|
CWnd cwndParent;
|
|
CString strDefName;
|
|
CString strName;
|
|
SCESTATUS status = SCESTATUS_SUCCESS;
|
|
CString strOfnTitle;
|
|
|
|
strDefExtension.LoadString(IDS_PROFILE_DEF_EXT);
|
|
strFilter.LoadString(IDS_PROFILE_FILTER);
|
|
strOfnTitle.LoadString(IDS_EXPORT_CONFIG_OFN_TITLE);
|
|
|
|
//
|
|
// Get the working directory for INF files.
|
|
//
|
|
LPTSTR pszDir = NULL;
|
|
if( GetWorkingDir( GWD_EXPORT_TEMPLATE, &pszDir ) )
|
|
{
|
|
strDefName = pszDir;
|
|
LocalFree(pszDir);
|
|
pszDir = NULL;
|
|
}
|
|
strDefName += TEXT("\\*.");
|
|
strDefName += strDefExtension;
|
|
|
|
// Translate filter into commdlg format (lots of \0)
|
|
LPTSTR szFilter = strFilter.GetBuffer(0); // modify the buffer in place
|
|
LPTSTR pch = szFilter;
|
|
// MFC delimits with '|' not '\0'
|
|
while ((pch = _tcschr(pch, '|')) != NULL)
|
|
*pch++ = '\0';
|
|
// do not call ReleaseBuffer() since the string contains '\0' characters
|
|
|
|
|
|
OPENFILENAME ofn;
|
|
::ZeroMemory (&ofn, sizeof (OPENFILENAME));
|
|
ofn.lStructSize = sizeof(OPENFILENAME);
|
|
ofn.lpstrFilter = szFilter;
|
|
ofn.lpstrFile = strDefName.GetBuffer(MAX_PATH),
|
|
ofn.nMaxFile = MAX_PATH;
|
|
ofn.lpstrDefExt = strDefExtension,
|
|
ofn.hwndOwner = m_hwndParent;
|
|
ofn.Flags = OFN_HIDEREADONLY |
|
|
OFN_SHAREAWARE |
|
|
OFN_EXPLORER |
|
|
OFN_DONTADDTORECENT|OFN_ENABLEHOOK;
|
|
ofn.lpstrTitle = strOfnTitle;
|
|
ofn.lpfnHook = OFNHookProc; //Raid #567750, yanggao.
|
|
|
|
if (GetSaveFileName(&ofn))
|
|
{
|
|
strDefName.ReleaseBuffer();
|
|
strName = ofn.lpstrFile;
|
|
|
|
//
|
|
// Set the working directory for inf files.
|
|
//
|
|
pszDir = strName.GetBuffer(0);
|
|
GetWorkingDir( GWD_EXPORT_TEMPLATE, &pszDir, TRUE, TRUE );
|
|
strName.ReleaseBuffer();
|
|
//
|
|
// Generate new inf file
|
|
//
|
|
|
|
status = SceCopyBaseProfile(GetSadHandle(),
|
|
SCE_ENGINE_SCP,
|
|
(LPTSTR)(LPCTSTR)strName,
|
|
AREA_ALL,
|
|
NULL );
|
|
if (SCESTATUS_SUCCESS != status)
|
|
{
|
|
CString str;
|
|
CString strErr;
|
|
|
|
MyFormatMessage( status, NULL, NULL, strErr); //Raid #621091, yanggao
|
|
AfxFormatString2(str,IDS_EXPORT_FAILED,strName,strErr);
|
|
AfxMessageBox(str);
|
|
return S_FALSE;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Method: OnExportPolicy()
|
|
//
|
|
// Synopsis: This function exports either the effective or local table
|
|
// from the system security database to a file.
|
|
//
|
|
// The function asks the user for a file through the CFileOpen
|
|
// class, then writes out the contents of either the effective
|
|
// or local policy table in the system database.
|
|
//
|
|
// Arguments: [bEffective] - Either to export the effect or local table.
|
|
//
|
|
// Returns: S_OK - if everything went well.
|
|
// S_FALSE - something failed.
|
|
//---------------------------------------------------------------------------
|
|
HRESULT
|
|
CComponentDataImpl::OnExportPolicy( BOOL bEffective )
|
|
{
|
|
CString strDefExtension;
|
|
CString strFilter;
|
|
CString strOfnTitle;
|
|
CString strDefName;
|
|
CString strName;
|
|
DWORD dwErr = 0;
|
|
BOOL bCopySuccess = FALSE;
|
|
//Raid #604879, yanggao, 4/24/2002
|
|
PEDITTEMPLATE pTemplateInfo = NULL;
|
|
AREA_INFORMATION area = AREA_SECURITY_POLICY|AREA_PRIVILEGES;
|
|
if( m_Mode == SCE_MODE_LOCAL_COMPUTER )
|
|
{
|
|
strName = GT_LOCAL_POLICY;
|
|
if (!SadHandle || ERROR_SUCCESS != SadErrored )
|
|
{
|
|
LoadSadInfo(FALSE);
|
|
if( !SadHandle || ERROR_SUCCESS != SadErrored )
|
|
return S_FALSE;
|
|
}
|
|
pTemplateInfo = GetTemplate(strName,area,&dwErr);
|
|
if( !pTemplateInfo )
|
|
{
|
|
return S_FALSE;
|
|
}
|
|
}
|
|
|
|
strDefExtension.LoadString(IDS_PROFILE_DEF_EXT);
|
|
strFilter.LoadString(IDS_PROFILE_FILTER);
|
|
strOfnTitle.LoadString(IDS_EXPORT_POLICY_OFN_TITLE);
|
|
|
|
//
|
|
// Get the working directory for locations.
|
|
//
|
|
LPTSTR pszDir = NULL;
|
|
if( GetWorkingDir( GWD_EXPORT_TEMPLATE, &pszDir ) )
|
|
{
|
|
strDefName = pszDir;
|
|
LocalFree(pszDir);
|
|
pszDir = NULL;
|
|
}
|
|
strDefName += TEXT("\\*.");
|
|
strDefName += strDefExtension;
|
|
|
|
// Translate filter into commdlg format (lots of \0)
|
|
LPTSTR szFilter = strFilter.GetBuffer(0); // modify the buffer in place
|
|
LPTSTR pch = szFilter;
|
|
// MFC delimits with '|' not '\0'
|
|
while ((pch = _tcschr(pch, '|')) != NULL)
|
|
*pch++ = '\0';
|
|
// do not call ReleaseBuffer() since the string contains '\0' characters
|
|
|
|
|
|
OPENFILENAME ofn;
|
|
::ZeroMemory (&ofn, sizeof (OPENFILENAME));
|
|
ofn.lStructSize = sizeof(OPENFILENAME);
|
|
ofn.lpstrFilter = szFilter;
|
|
ofn.lpstrFile = strDefName.GetBuffer(MAX_PATH),
|
|
ofn.nMaxFile = MAX_PATH;
|
|
ofn.lpstrDefExt = strDefExtension,
|
|
ofn.hwndOwner = m_hwndParent;
|
|
ofn.Flags = OFN_HIDEREADONLY |
|
|
OFN_SHAREAWARE |
|
|
OFN_EXPLORER |
|
|
OFN_DONTADDTORECENT;
|
|
ofn.lpstrTitle = strOfnTitle;
|
|
|
|
if (GetSaveFileName(&ofn))
|
|
{
|
|
strDefName.ReleaseBuffer();
|
|
strName = ofn.lpstrFile;
|
|
|
|
//
|
|
// Set the working directory for locations.
|
|
//
|
|
pszDir = strName.GetBuffer(0);
|
|
GetWorkingDir( GWD_EXPORT_TEMPLATE, &pszDir, TRUE, TRUE );
|
|
strName.ReleaseBuffer();
|
|
|
|
//
|
|
// Make sure we can make the file.
|
|
//
|
|
dwErr = FileCreateError( strName, 0 ); //Raid #prefast
|
|
if(dwErr == IDNO)
|
|
{
|
|
return S_FALSE;
|
|
}
|
|
|
|
//
|
|
// Generate the template
|
|
//
|
|
|
|
SCESTATUS sceStatus;
|
|
CWaitCursor wc;
|
|
//Raid #604879, yanggao, 4/24/2002
|
|
sceStatus = SceWriteSecurityProfileInfo(strName.GetBuffer(0),
|
|
area,
|
|
pTemplateInfo->pTemplate,
|
|
NULL);
|
|
strName.ReleaseBuffer();
|
|
|
|
if(sceStatus != SCESTATUS_SUCCESS)
|
|
{
|
|
//
|
|
// Display the error message
|
|
//
|
|
DWORD dwError = SceStatusToDosError( sceStatus );
|
|
CString strErr;
|
|
MyFormatMessage( sceStatus, NULL, NULL, strErr );
|
|
strErr += strName;
|
|
|
|
AfxMessageBox( strErr, MB_ICONEXCLAMATION | MB_OK );
|
|
return S_FALSE;
|
|
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
|
|
//+--------------------------------------------------------------------------------------------
|
|
// CComponentDataImpl::OnImportPolicy
|
|
//
|
|
// Import policy opens a file open dialog box in which the user is allowed to choose
|
|
// a security configuration INF file to import into security policy.
|
|
//
|
|
//
|
|
// Arguments: [pDataObject] - The data object associated with the folder calling
|
|
// this function.
|
|
// Returns: S_OK - Import was successful.
|
|
// S_FALSE - Something went wrong.
|
|
//---------------------------------------------------------------------------------------------
|
|
HRESULT
|
|
CComponentDataImpl::OnImportPolicy(LPDATAOBJECT pDataObject)
|
|
{
|
|
CString strDefExtension;
|
|
CString strFilter;
|
|
CString strOfnTitle;
|
|
CWnd cwndParent;
|
|
CString strDefName;
|
|
CString strName;
|
|
|
|
|
|
strDefExtension.LoadString(IDS_PROFILE_DEF_EXT);
|
|
strFilter.LoadString(IDS_PROFILE_FILTER);
|
|
strOfnTitle.LoadString(IDS_IMPORT_POLICY_OFN_TITLE);
|
|
|
|
|
|
LPTSTR pszDir = NULL;
|
|
if( GetWorkingDir( GWD_IMPORT_TEMPLATE, &pszDir ) )
|
|
{
|
|
strDefName = pszDir;
|
|
LocalFree(pszDir);
|
|
pszDir = NULL;
|
|
}
|
|
strDefName += TEXT("\\*.");
|
|
strDefName += strDefExtension;
|
|
|
|
cwndParent.Attach(m_hwndParent);
|
|
CAssignConfiguration fo(TRUE, // File open
|
|
strDefExtension, // Default Extension
|
|
strDefName, // Initial File Name == current DB
|
|
OFN_HIDEREADONLY| // Don't show the read only prompt
|
|
OFN_SHAREAWARE|
|
|
OFN_EXPLORER| // Explorer style dialog
|
|
OFN_ENABLETEMPLATE| // custom template
|
|
OFN_DONTADDTORECENT|
|
|
OFN_PATHMUSTEXIST, // The Template must exist for us to assign it.
|
|
strFilter, // Filter for allowed extensions
|
|
&cwndParent); // Dialog's Parent window
|
|
cwndParent.Detach();
|
|
|
|
fo.m_ofn.lpstrTitle = strOfnTitle.GetBuffer(1);
|
|
fo.m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_ASSIGN_CONFIG_CHECK);
|
|
|
|
CThemeContextActivator activator;
|
|
if (IDOK == fo.DoModal())
|
|
{
|
|
PVOID pHandle = NULL;
|
|
BOOL bIncremental = fo.m_bIncremental;
|
|
|
|
strName = fo.GetPathName();
|
|
pszDir = strName.GetBuffer(0);
|
|
GetWorkingDir( GWD_IMPORT_TEMPLATE, &pszDir, TRUE, TRUE );
|
|
strName.ReleaseBuffer();
|
|
CWaitCursor wc;
|
|
|
|
CEditTemplate *pet = NULL; //Raid #Prefast
|
|
|
|
//
|
|
// pet will be freed in m_Templates in DeleteTemplate
|
|
//
|
|
pet = GetTemplate(strName,AREA_ALL);
|
|
|
|
CString strErr;
|
|
CString strSCE;
|
|
int ret=0;
|
|
|
|
if ( pet == NULL )
|
|
{
|
|
//
|
|
// this is an invalid template or something is wrong reading the data out
|
|
//
|
|
|
|
strSCE.LoadString(IDS_EXTENSION_NAME);
|
|
strErr.Format(IDS_IMPORT_POLICY_INVALID,strName);
|
|
m_pConsole->MessageBox(strErr,strSCE,MB_OK,&ret);
|
|
|
|
return S_FALSE;
|
|
|
|
}
|
|
else
|
|
{
|
|
// Bug 437891, Yang Gao, 7/20/2001
|
|
// Create a new template there if there isn't one already
|
|
//
|
|
PSCE_PROFILE_INFO spi = NULL;
|
|
if( CreateNewProfile(m_szSingleTemplateName,&spi) )
|
|
{
|
|
if ( ( bIncremental &&
|
|
(SCESTATUS_SUCCESS != SceAppendSecurityProfileInfo(m_szSingleTemplateName,
|
|
AREA_ALL,
|
|
pet->pTemplate,
|
|
NULL))) ||
|
|
(!bIncremental && !CopyFile(strName,m_szSingleTemplateName,FALSE) ) ) //This is a safe usage.
|
|
{
|
|
//
|
|
// Import Failed
|
|
//
|
|
strSCE.LoadString(IDS_EXTENSION_NAME);
|
|
strErr.Format(IDS_IMPORT_POLICY_FAIL,strName);
|
|
m_pConsole->MessageBox(strErr,strSCE,MB_OK,&ret);
|
|
|
|
DeleteTemplate(strName);
|
|
|
|
return S_FALSE;
|
|
}
|
|
if ( this->m_pNotifier && pet->QueryPolicy() ) //Raid #522006, 2/28/2002, yanggao
|
|
{
|
|
this->m_pNotifier->RefreshPolicy();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// Import Failed
|
|
//
|
|
strSCE.LoadString(IDS_EXTENSION_NAME);
|
|
strErr.Format(IDS_IMPORT_POLICY_FAIL,strName);
|
|
m_pConsole->MessageBox(strErr,strSCE,MB_OK,&ret);
|
|
DeleteTemplate(strName);
|
|
return S_FALSE;
|
|
}
|
|
|
|
DeleteTemplate(strName);
|
|
|
|
}
|
|
|
|
DeleteTemplate(m_szSingleTemplateName);
|
|
|
|
//
|
|
// Update the window.
|
|
//
|
|
pet = GetTemplate(m_szSingleTemplateName);
|
|
if(pet)
|
|
{
|
|
DWORD dwErr = pet->RefreshTemplate();
|
|
if ( 0 != dwErr )
|
|
{
|
|
CString strErr;
|
|
|
|
MyFormatResMessage (SCESTATUS_SUCCESS, dwErr, NULL, strErr);
|
|
AfxMessageBox(strErr);
|
|
return S_FALSE;
|
|
}
|
|
}
|
|
RefreshAllFolders();
|
|
return S_OK;
|
|
}
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
//+--------------------------------------------------------------------------------------------
|
|
// CComponentDataImpl::OnImportLocalPolicy
|
|
//
|
|
// Import policy opens a file open dialog box in which the user is allowed to choose
|
|
// a security configuration INF file to import into local policy.
|
|
//
|
|
// The function asks for the file name then calls SceConfigureSystem() with the
|
|
// SCE_NO_CONFIG option. This imports the specifide file into the local policy
|
|
// database.
|
|
//
|
|
// After the database is updated, we refresh the local policy template held in memory.
|
|
//
|
|
// Arguments: [pDataObject] - The data object associated with the folder calling
|
|
// this function.
|
|
// Returns: S_OK - Import was successful.
|
|
// S_FALSE - Something went wrong.
|
|
//---------------------------------------------------------------------------------------------
|
|
HRESULT
|
|
CComponentDataImpl::OnImportLocalPolicy(LPDATAOBJECT pDataObject)
|
|
{
|
|
CString strDefExtension;
|
|
CString strFilter;
|
|
CString strOfnTitle;
|
|
CString strDefName;
|
|
CString strName;
|
|
DWORD dwErr = 0;
|
|
SCESTATUS sceStatus = SCESTATUS_SUCCESS;
|
|
CString strErr;
|
|
CString strY;
|
|
|
|
|
|
strDefExtension.LoadString(IDS_PROFILE_DEF_EXT);
|
|
strFilter.LoadString(IDS_PROFILE_FILTER);
|
|
strOfnTitle.LoadString(IDS_IMPORT_POLICY_OFN_TITLE);
|
|
|
|
// Translate filter into commdlg format (lots of \0)
|
|
LPTSTR szFilter = strFilter.GetBuffer(0); // modify the buffer in place
|
|
LPTSTR pch = szFilter;
|
|
// MFC delimits with '|' not '\0'
|
|
while ((pch = _tcschr(pch, TEXT('|'))) != NULL)
|
|
*pch++ = TEXT('\0');
|
|
// do not call ReleaseBuffer() since the string contains '\0' characters
|
|
|
|
LPTSTR pszDir = NULL;
|
|
if( GetWorkingDir( GWD_IMPORT_TEMPLATE, &pszDir ) )
|
|
{
|
|
strDefName = pszDir;
|
|
LocalFree(pszDir);
|
|
pszDir = NULL;
|
|
}
|
|
strDefName += TEXT("\\*.");
|
|
strDefName += strDefExtension;
|
|
|
|
|
|
OPENFILENAME ofn;
|
|
::ZeroMemory (&ofn, sizeof (OPENFILENAME));
|
|
ofn.lStructSize = sizeof(OPENFILENAME);
|
|
ofn.lpstrFilter = szFilter;
|
|
ofn.lpstrFile = strDefName.GetBuffer(MAX_PATH),
|
|
ofn.nMaxFile = MAX_PATH;
|
|
ofn.lpstrDefExt = strDefExtension,
|
|
ofn.hwndOwner = m_hwndParent;
|
|
ofn.Flags = OFN_HIDEREADONLY |
|
|
OFN_SHAREAWARE |
|
|
OFN_EXPLORER |
|
|
OFN_DONTADDTORECENT|
|
|
OFN_FILEMUSTEXIST; //Raid #535787, yanggao, 4/18/2002.
|
|
ofn.lpstrTitle = strOfnTitle;
|
|
|
|
if (GetOpenFileName(&ofn))
|
|
{
|
|
PVOID pHandle = NULL;
|
|
|
|
strName = ofn.lpstrFile;
|
|
pszDir = strName.GetBuffer(0);
|
|
GetWorkingDir( GWD_IMPORT_TEMPLATE, &pszDir, TRUE, TRUE );
|
|
strName.ReleaseBuffer();
|
|
CWaitCursor wc;
|
|
|
|
CEditTemplate *pet;
|
|
//Get error info
|
|
//Raid #502571, 12/18/2001, yanggao
|
|
pet = GetTemplate(strName,AREA_SECURITY_POLICY|AREA_PRIVILEGES, &dwErr);
|
|
if (!pet)
|
|
{
|
|
strErr.LoadString(dwErr);
|
|
AppMessageBox(NULL, strErr, NULL, MB_ICONSTOP|MB_OK);
|
|
return S_FALSE;
|
|
}
|
|
|
|
//
|
|
// We're going to alter this one so make sure it doesn't save out
|
|
//
|
|
pet->SetNoSave(TRUE);
|
|
|
|
//
|
|
// Remove entries that are set by domain policy since they'll be overwritten
|
|
// anyway and we don't allow setting things that'll be overwritten.
|
|
//
|
|
RemovePolicyEntries(pet);
|
|
|
|
//
|
|
// 120502 - SceUpdateSecurityProfile doesn't work with SCE_STRUCT_INF,
|
|
// but the AREA_SECURITY_POLICY and AREA_PRIVILEGES sections are
|
|
// compatable so we can call it SCE_ENGINE_SYSTEM, which will work.
|
|
//
|
|
SCETYPE origType = pet->pTemplate->Type;
|
|
pet->pTemplate->Type = SCE_ENGINE_SYSTEM;
|
|
|
|
sceStatus = SceUpdateSecurityProfile(NULL,
|
|
AREA_SECURITY_POLICY|AREA_PRIVILEGES,
|
|
pet->pTemplate,
|
|
SCE_UPDATE_SYSTEM
|
|
);
|
|
//
|
|
// Set the type back so the engine knows how to delete it properly
|
|
//
|
|
pet->pTemplate->Type = origType;
|
|
|
|
if (SCESTATUS_SUCCESS != sceStatus)
|
|
{
|
|
goto ret_error;
|
|
}
|
|
//
|
|
// Update the window.
|
|
//
|
|
pet = GetTemplate(GT_LOCAL_POLICY);
|
|
if(pet)
|
|
{
|
|
dwErr = pet->RefreshTemplate(); //Raid #prefast
|
|
if ( 0 != dwErr )
|
|
{
|
|
CString strErr;
|
|
|
|
MyFormatResMessage (SCESTATUS_SUCCESS, dwErr, NULL, strErr);
|
|
AfxMessageBox(strErr);
|
|
return S_FALSE;
|
|
}
|
|
}
|
|
RefreshAllFolders();
|
|
return S_OK;
|
|
}
|
|
|
|
strDefName.ReleaseBuffer();
|
|
return S_FALSE;
|
|
ret_error:
|
|
strDefName.ReleaseBuffer();
|
|
MyFormatMessage( sceStatus, NULL, NULL, strErr);
|
|
strErr += strName;
|
|
strErr += L"\n";
|
|
strErr += strY;
|
|
AfxMessageBox( strErr, MB_OK);
|
|
return S_FALSE;
|
|
|
|
}
|
|
|
|
|
|
HRESULT
|
|
CComponentDataImpl::OnAnalyze()
|
|
{
|
|
PEDITTEMPLATE pet;
|
|
|
|
//
|
|
// If the computer template has been changed then save it before
|
|
// we can inspect against it
|
|
//
|
|
pet = GetTemplate(GT_COMPUTER_TEMPLATE);
|
|
if (pet && pet->IsDirty())
|
|
{
|
|
pet->Save();
|
|
}
|
|
|
|
m_pUIThread->PostThreadMessage(SCEM_ANALYZE_PROFILE,(WPARAM)(LPCTSTR)SadName,(LPARAM)this);
|
|
return S_OK;
|
|
}
|
|
|
|
BOOL
|
|
CComponentDataImpl::RemovePolicyEntries(PEDITTEMPLATE pet)
|
|
{
|
|
PEDITTEMPLATE petPol = GetTemplate(GT_EFFECTIVE_POLICY);
|
|
|
|
if (!petPol)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
#define CD(X) if (petPol->pTemplate->X != SCE_NO_VALUE) { pet->pTemplate->X = SCE_NO_VALUE; };
|
|
|
|
CD(MinimumPasswordAge);
|
|
CD(MaximumPasswordAge);
|
|
CD(MinimumPasswordLength);
|
|
CD(PasswordComplexity);
|
|
CD(PasswordHistorySize);
|
|
CD(LockoutBadCount);
|
|
CD(ResetLockoutCount);
|
|
CD(LockoutDuration);
|
|
CD(RequireLogonToChangePassword);
|
|
CD(ForceLogoffWhenHourExpire);
|
|
CD(EnableAdminAccount);
|
|
CD(EnableGuestAccount);
|
|
|
|
// These members aren't declared in NT4
|
|
CD(ClearTextPassword);
|
|
CD(AuditDSAccess);
|
|
CD(AuditAccountLogon);
|
|
CD(LSAAnonymousNameLookup);
|
|
|
|
CD(MaximumLogSize[0]);
|
|
CD(MaximumLogSize[1]);
|
|
CD(MaximumLogSize[2]);
|
|
CD(AuditLogRetentionPeriod[0]);
|
|
CD(AuditLogRetentionPeriod[1]);
|
|
CD(AuditLogRetentionPeriod[2]);
|
|
CD(RetentionDays[0]);
|
|
CD(RetentionDays[1]);
|
|
CD(RetentionDays[2]);
|
|
CD(RestrictGuestAccess[0]);
|
|
CD(RestrictGuestAccess[1]);
|
|
CD(RestrictGuestAccess[2]);
|
|
CD(AuditSystemEvents);
|
|
CD(AuditLogonEvents);
|
|
CD(AuditObjectAccess);
|
|
CD(AuditPrivilegeUse);
|
|
CD(AuditPolicyChange);
|
|
CD(AuditAccountManage);
|
|
CD(AuditProcessTracking);
|
|
|
|
//
|
|
// These two are strings rather than DWORDs
|
|
//
|
|
if (petPol->pTemplate->NewAdministratorName && pet->pTemplate->NewAdministratorName)
|
|
{
|
|
LocalFree(pet->pTemplate->NewAdministratorName);
|
|
pet->pTemplate->NewAdministratorName = NULL;
|
|
}
|
|
if (petPol->pTemplate->NewGuestName && pet->pTemplate->NewGuestName)
|
|
{
|
|
LocalFree(pet->pTemplate->NewGuestName);
|
|
pet->pTemplate->NewGuestName = NULL;
|
|
}
|
|
|
|
#undef CD
|
|
|
|
//
|
|
// Clear privileges set in PetPol out of pet
|
|
//
|
|
|
|
SCE_PRIVILEGE_ASSIGNMENT *ppaPet = pet->pTemplate->OtherInfo.smp.pPrivilegeAssignedTo;
|
|
SCE_PRIVILEGE_ASSIGNMENT *ppaPol = petPol->pTemplate->OtherInfo.smp.pPrivilegeAssignedTo;
|
|
|
|
SCE_PRIVILEGE_ASSIGNMENT *ppaLast = NULL;
|
|
for(SCE_PRIVILEGE_ASSIGNMENT *ppa = ppaPol; ppa != NULL ; ppa = ppa->Next)
|
|
{
|
|
for (SCE_PRIVILEGE_ASSIGNMENT *ppa2 = ppaPet;
|
|
ppa2 != NULL;
|
|
ppaLast = ppa2, ppa2 = ppa2->Next) {
|
|
if (0 == lstrcmpi(ppa->Name,ppa2->Name))
|
|
{
|
|
if (ppaLast)
|
|
{
|
|
ppaLast->Next = ppa2->Next;
|
|
}
|
|
else
|
|
{
|
|
// Front of list
|
|
ppaPet = ppa2->Next;
|
|
}
|
|
ppa2->Next = NULL;
|
|
SceFreeMemory(ppa2,SCE_STRUCT_PRIVILEGE);
|
|
ppa2 = ppaLast;
|
|
//
|
|
// Found it, so don't bother checking the rest
|
|
//
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// Clear reg values set in PetPol out of pet
|
|
//
|
|
SCE_REGISTRY_VALUE_INFO *rvPet = pet->pTemplate->aRegValues;
|
|
SCE_REGISTRY_VALUE_INFO *rvPol = petPol->pTemplate->aRegValues;
|
|
for(DWORD i=0;i< petPol->pTemplate->RegValueCount;i++)
|
|
{
|
|
for (DWORD j=0;j<pet->pTemplate->RegValueCount;j++)
|
|
{
|
|
if (0 == lstrcmpi(rvPol[i].FullValueName,rvPet[j].FullValueName))
|
|
{
|
|
// Match. Delete Value from pet
|
|
if (rvPet[j].Value)
|
|
{
|
|
LocalFree(rvPet[j].Value);
|
|
rvPet[j].Value = NULL;
|
|
}
|
|
//
|
|
// Found it, so don't bother checking rest
|
|
//
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|