📄 hashauthbase.cpp
字号:
STDMETHODIMP CHashAuthenticatorBase::SetCredentials(IHXAuthenticationDBManagerResponse* pDBRespondee, IHXBuffer* pPrincipalID, IHXBuffer* pPassword){ if(!pDBRespondee) { return HXR_UNEXPECTED; } m_pAuthDBRespondee = pDBRespondee; m_pAuthDBRespondee->AddRef(); if (!m_pAuthDBManager) { m_pAuthDBRespondee->SetCredentialsDone(HXR_NOINTERFACE, pPrincipalID); HX_RELEASE(m_pAuthDBRespondee); return HXR_NOINTERFACE; } IHXBuffer* pStorageKey = NULL; _MungeUserRealmPass(pPrincipalID, m_pRealm, pPassword, &pStorageKey); m_pAuthDBManager->SetCredentials(this, pPrincipalID, pStorageKey); HX_RELEASE(pStorageKey); return HXR_OK;}// IHXAuthenticationDBManagerResponseSTDMETHODIMP CHashAuthenticatorBase::AddPrincipalDone(HX_RESULT hr, IHXBuffer* pBufferPrincipalID){ m_pAuthDBRespondee->AddPrincipalDone(hr, pBufferPrincipalID); HX_RELEASE(m_pAuthDBRespondee); return HXR_OK;}STDMETHODIMP CHashAuthenticatorBase::RemovePrincipalDone(HX_RESULT hr, IHXBuffer* pBufferPrincipalID){ m_pAuthDBRespondee->RemovePrincipalDone(hr, pBufferPrincipalID); HX_RELEASE(m_pAuthDBRespondee); return HXR_OK;}STDMETHODIMP CHashAuthenticatorBase::SetCredentialsDone(HX_RESULT hr, IHXBuffer* pBufferPrincipalID){ m_pAuthDBRespondee->SetCredentialsDone(hr, pBufferPrincipalID); HX_RELEASE(m_pAuthDBRespondee); return HXR_OK;}/************************************************************************ * Method: * IHXAuthenticationDBAccess::_NewEnum * Purpose: * * Call this to make a new enumerator of this collection. * */STDMETHODIMP CHashAuthenticatorBase::_NewEnum(REF(IHXAsyncEnumAuthenticationDB*) pEnumDBNew){ if (m_pAuthDBAccess) { return m_pAuthDBAccess->_NewEnum(pEnumDBNew); } else { pEnumDBNew = NULL; return HXR_NOINTERFACE; }}/************************************************************************ * Method: * IRMAAuthenticationDBAccess::CheckExistence * Purpose: * * Call this to verify the existance of a principal. * */STDMETHODIMP CHashAuthenticatorBase::CheckExistence(IHXAuthenticationDBAccessResponse* pDBAccessResp, IHXBuffer* pBufferPrincipalID){ if(!pDBAccessResp) { return HXR_UNEXPECTED; } // XXXSSH - why not implemented? pDBAccessResp->ExistenceCheckDone(HXR_NOTIMPL, pBufferPrincipalID); return HXR_OK;}/************************************************************************ * Method: * IHXAuthenticationDBAccess::GetCredentials * Purpose: * * Call this to access the credentials for the specified principal. * */STDMETHODIMP CHashAuthenticatorBase::GetCredentials(IHXAuthenticationDBAccessResponse* pDBAccessResp, IHXBuffer* pBufferPrincipalID){ if(!pDBAccessResp) { return HXR_UNEXPECTED; } // XXXSSH - why not implemented? pDBAccessResp->GetCredentialsDone(HXR_NOTIMPL, pBufferPrincipalID, NULL); return HXR_OK;}HX_RESULT CHashAuthenticatorBase::_MungeUserRealmPass(IHXBuffer* pUserName, IHXBuffer* pRealm, IHXBuffer* pPassword, IHXBuffer** ppStorageKey){ HX_ASSERT(pUserName && pPassword && pRealm); char resbuf[1024]; /* Flawfinder: ignore */ (*ppStorageKey) = new CHXBuffer; (*ppStorageKey)->AddRef(); (*ppStorageKey)->SetSize(64); char* sMD5 = (char*)(*ppStorageKey)->GetBuffer(); sprintf(resbuf, "%-.200s:%-.200s:%-.200s", /* Flawfinder: ignore */ pUserName->GetBuffer(), pRealm->GetBuffer(), pPassword->GetBuffer()); //The result of this MD5 is what needs to be stored in //a file somewhere in the server, associated with the username. MD5Data(sMD5, (BYTE*)resbuf, strlen(resbuf)); return HXR_OK;}BOOL CHashAuthenticatorBase::_GetQuotedValue(const char*& instr, char* valname, char* valbuf){ char* equals = (char*)strchr(instr, '='); if(!equals) return FALSE; while(isspace(*(equals - 1)) && equals > instr) equals--; if(equals <= instr || (equals - instr > 200)) return FALSE; strncpy(valname, instr, equals - instr); /* Flawfinder: ignore */ valname[equals -instr] = 0; char* firstquote = strchr(equals, '"'); if(!firstquote) return FALSE; char* secondquote = strchr(firstquote + 1, '"'); if(!secondquote || (secondquote - firstquote > 200)) return FALSE; strncpy(valbuf, firstquote + 1, secondquote - firstquote - 1); /* Flawfinder: ignore */ valbuf[secondquote - firstquote - 1] = 0; instr = secondquote + 1; return TRUE;}BOOL CHashAuthenticatorBase::GetNameValuePair(const char*& instr, char* valname, char* valbuf){ char* equals = (char*)strchr(instr, '='); if(!equals) return FALSE; while(isspace(*(equals - 1)) && equals > instr) equals--; if(equals <= instr || (equals - instr > 200)) return FALSE; strncpy(valname, instr, equals - instr); /* Flawfinder: ignore */ valname[equals -instr] = 0; equals++; while (isspace(*equals)) equals++; if (*equals==',') { return FALSE; } else { if (*equals=='"') { char* firstquote = equals; char* secondquote = strchr(firstquote + 1, '"'); if(!secondquote || (secondquote - firstquote > 200)) return FALSE; strncpy(valbuf, firstquote + 1, secondquote - firstquote - 1); /* Flawfinder: ignore */ valbuf[secondquote - firstquote - 1] = 0; instr = secondquote + 1; return TRUE; } else { // Non Quoted string char* szvalstart = equals; equals++; while (!isspace(*equals) && *equals && (*equals!=',')) equals++; char* szvalend = equals; strncpy(valbuf, szvalstart, szvalend-szvalstart); valbuf[szvalend-szvalstart] = 0; instr = szvalend; return TRUE; } } }HX_RESULT CHashAuthenticatorBase::_GetQuotedFields(char* s, IHXValues* pValues){ char valbuf[256]; /* Flawfinder: ignore */ char valname[256]; /* Flawfinder: ignore */ BOOL done = FALSE; while(!done) { while ((isspace(*s) || *s == ',') && *s) { ++s; } if(!(*s)) break; if (GetNameValuePair((const char*&)s, valname, valbuf)) { _SetPropertyFromCharArray(pValues, valname, valbuf); } else { done = TRUE; } } return HXR_OK;}void CHashAuthenticatorBase::_SetPropertyFromCharArray(IHXValues* pOptions, const char* sName, const char* sValue){ IHXBuffer* pVal = NULL; CHXBuffer::FromCharArray(sValue, &pVal); pOptions->SetPropertyCString(sName, pVal); HX_RELEASE(pVal);}/* Returns the repsonse headers from m_pServerRequest, creating them if they don't exist. Caller must release the returned pointer */IHXValues* CHashAuthenticatorBase::_GetResponseHeaders(){ HX_ASSERT(m_pServerRequest); if (!m_pServerRequest) return NULL; // uh-oh IHXValues* pResHeaders = NULL; m_pServerRequest->GetResponseHeaders(pResHeaders); if (!pResHeaders) { IUnknown* pUnknown = NULL; IHXCommonClassFactory* pFactory = NULL; m_pContext->QueryInterface(IID_IHXCommonClassFactory, (void **)&pFactory); if (pFactory) { pFactory->CreateInstance(CLSID_IHXKeyValueList, (void**)&pUnknown); HX_RELEASE(pFactory); } if (pUnknown) { pUnknown->QueryInterface(IID_IHXValues, (void**)&pResHeaders); if (pResHeaders) { m_pServerRequest->SetResponseHeaders(pResHeaders); } HX_RELEASE(pUnknown); } } return pResHeaders;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -