#include "msrating.h" #include "msluglob.h" #include "mslubase.h" #include "hint.h" #include "debug.h" #include 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); }