185 lines
5.2 KiB
C++
185 lines
5.2 KiB
C++
|
#include "msrating.h"
|
||
|
#include "msluglob.h"
|
||
|
#include "mslubase.h"
|
||
|
#include "hint.h"
|
||
|
#include "debug.h"
|
||
|
#include <md5.h>
|
||
|
|
||
|
extern PicsRatingSystemInfo *gPRSI;
|
||
|
|
||
|
HRESULT VerifySupervisorPassword(LPCSTR pszPassword)
|
||
|
{
|
||
|
if ( ! ::fSupervisorKeyInit )
|
||
|
{
|
||
|
HKEY hkeyRating;
|
||
|
LONG err;
|
||
|
|
||
|
hkeyRating = CreateRegKeyNT(::szRATINGS);
|
||
|
if (hkeyRating != NULL)
|
||
|
{
|
||
|
DWORD cbData = sizeof(::abSupervisorKey);
|
||
|
DWORD dwType;
|
||
|
|
||
|
// Attempt to look for "Key"
|
||
|
err = ::RegQueryValueEx(hkeyRating, ::szRatingsSupervisorKeyName, NULL,
|
||
|
&dwType, (LPBYTE)::abSupervisorKey, &cbData);
|
||
|
|
||
|
::RegCloseKey(hkeyRating);
|
||
|
hkeyRating = NULL;
|
||
|
|
||
|
if (err == ERROR_SUCCESS)
|
||
|
{
|
||
|
if (dwType != REG_BINARY || cbData != sizeof(::abSupervisorKey))
|
||
|
{
|
||
|
TraceMsg( TF_WARNING, "VerifySupervisorPassword() - Unexpected Error dwType=%d, cbData=%d!", dwType, cbData );
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
::fSupervisorKeyInit = TRUE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (pszPassword == NULL)
|
||
|
{
|
||
|
TraceMsg( TF_WARNING, "VerifySupervisorPassword() - Supervisor Key '%s' not found!", ::szRatingsSupervisorKeyName );
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
TraceMsg( TF_ERROR, "VerifySupervisorPassword() - Failed to Create Ratings Registry Key!" );
|
||
|
err = ERROR_FILE_NOT_FOUND;
|
||
|
}
|
||
|
|
||
|
if (err != ERROR_SUCCESS)
|
||
|
{
|
||
|
TraceMsg( TF_WARNING, "VerifySupervisorPassword() - Error=0x%x!", err );
|
||
|
return HRESULT_FROM_WIN32(err);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (pszPassword == NULL)
|
||
|
{
|
||
|
TraceMsg( TF_ALWAYS, "VerifySupervisorPassword() - Comparing to NULL pszPassword returning S_FALSE." );
|
||
|
return ResultFromScode(S_FALSE);
|
||
|
}
|
||
|
|
||
|
// We should probably not be comparing to a blank password.
|
||
|
// ASSERT( pszPassword[0] != '\0' );
|
||
|
|
||
|
if ( pszPassword[0] == '\0' )
|
||
|
{
|
||
|
TraceMsg( TF_ALWAYS, "VerifySupervisorPassword() - Comparing to blank pszPassword." );
|
||
|
}
|
||
|
|
||
|
MD5_CTX ctx;
|
||
|
|
||
|
MD5Init(&ctx);
|
||
|
MD5Update(&ctx, (const BYTE *)pszPassword, ::strlenf(pszPassword)+1);
|
||
|
MD5Final(&ctx);
|
||
|
|
||
|
return ResultFromScode(::memcmpf(::abSupervisorKey, ctx.digest, sizeof(::abSupervisorKey)) ? S_FALSE : S_OK);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT ChangeSupervisorPassword(LPCSTR pszOldPassword, LPCSTR pszNewPassword)
|
||
|
{
|
||
|
HRESULT hres;
|
||
|
|
||
|
hres = ::VerifySupervisorPassword(pszOldPassword);
|
||
|
if (hres == S_FALSE)
|
||
|
{
|
||
|
TraceMsg( TF_WARNING, "ChangeSupervisorPassword() - VerifySupervisorPassword() false!" );
|
||
|
return E_ACCESSDENIED;
|
||
|
}
|
||
|
|
||
|
// If pszNewPassword is NULL or "" (blank password) we call RemoveSupervisorPassword().
|
||
|
if ( ! pszNewPassword )
|
||
|
{
|
||
|
TraceMsg( TF_ALWAYS, "ChangeSupervisorPassword() - pszNewPassword is NULL - Removing Supervisor Password!" );
|
||
|
return RemoveSupervisorPassword();
|
||
|
}
|
||
|
|
||
|
// Attempting to set a blank password should remove the Key from the Registry.
|
||
|
if ( pszNewPassword[0] == '\0' )
|
||
|
{
|
||
|
TraceMsg( TF_ALWAYS, "ChangeSupervisorPassword() - pszNewPassword is an empty string - Removing Supervisor Password!" );
|
||
|
return RemoveSupervisorPassword();
|
||
|
}
|
||
|
|
||
|
MD5_CTX ctx;
|
||
|
|
||
|
MD5Init(&ctx);
|
||
|
MD5Update(&ctx, (const BYTE *)pszNewPassword, ::strlenf(pszNewPassword)+1);
|
||
|
MD5Final(&ctx);
|
||
|
|
||
|
::memcpyf(::abSupervisorKey, ctx.digest, sizeof(::abSupervisorKey));
|
||
|
::fSupervisorKeyInit = TRUE;
|
||
|
|
||
|
hres = NOERROR;
|
||
|
|
||
|
HKEY hkeyRating;
|
||
|
|
||
|
hkeyRating = CreateRegKeyNT(::szRATINGS);
|
||
|
if (hkeyRating != NULL)
|
||
|
{
|
||
|
BYTE abTemp[sizeof(::abSupervisorKey)];
|
||
|
DWORD cbData = sizeof(::abSupervisorKey);
|
||
|
DWORD dwType;
|
||
|
if (::RegQueryValueEx(hkeyRating, ::szRatingsSupervisorKeyName, NULL,
|
||
|
&dwType, abTemp, &cbData) != ERROR_SUCCESS)
|
||
|
{
|
||
|
hres = S_FALSE; /* tell caller we're creating the new key */
|
||
|
}
|
||
|
|
||
|
::RegSetValueEx(hkeyRating, ::szRatingsSupervisorKeyName, NULL,
|
||
|
REG_BINARY, (const BYTE *)::abSupervisorKey, sizeof(::abSupervisorKey));
|
||
|
::RegCloseKey(hkeyRating);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
TraceMsg( TF_ERROR, "ChangeSupervisorPassword() - Failed to Create Ratings Registry Key!" );
|
||
|
hres = E_FAIL;
|
||
|
}
|
||
|
|
||
|
return hres;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT RemoveSupervisorPassword(void)
|
||
|
{
|
||
|
HKEY hkeyRating;
|
||
|
LONG err = E_FAIL;
|
||
|
|
||
|
hkeyRating = CreateRegKeyNT(::szRATINGS);
|
||
|
if (hkeyRating != NULL)
|
||
|
{
|
||
|
err = ::RegDeleteValue(hkeyRating, ::szRatingsSupervisorKeyName);
|
||
|
|
||
|
if ( err == ERROR_SUCCESS )
|
||
|
{
|
||
|
CHint hint;
|
||
|
|
||
|
hint.RemoveHint();
|
||
|
|
||
|
TraceMsg( TF_ALWAYS, "RemoveSupervisorPassword() - Removed supervisor password and hint." );
|
||
|
}
|
||
|
|
||
|
::RegCloseKey(hkeyRating);
|
||
|
hkeyRating = NULL;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
TraceMsg( TF_ERROR, "RemoveSupervisorPassword() - Failed to Create Ratings Registry Key!" );
|
||
|
}
|
||
|
|
||
|
if ( gPRSI )
|
||
|
{
|
||
|
gPRSI->fRatingInstalled = FALSE;
|
||
|
}
|
||
|
|
||
|
::fSupervisorKeyInit = FALSE;
|
||
|
return HRESULT_FROM_WIN32(err);
|
||
|
}
|