Added support for cookies and sessions. Logging in is now done via cookies.

git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@1799 726aef4b-f618-498e-8847-2d620e286838
This commit is contained in:
prozacx
2010-03-01 01:22:02 +00:00
parent b287385500
commit 78c1399992
8 changed files with 295 additions and 91 deletions
+35 -1
View File
@@ -41,6 +41,24 @@ void CHTTPSock::ReadData(const char* data, size_t len) {
}
}
bool CHTTPSock::SetCookie(const CString& sKey, const CString& sValue) {
if (!sKey.empty() && !sValue.empty()) {
m_msCookies[sKey] = sValue;
return true;
}
return false;
}
const MCString& CHTTPSock::GetCookies() const {
return m_msCookies;
}
CString CHTTPSock::GetCookie(const CString& sKey) const {
MCString::const_iterator it = m_msCookies.find(sKey);
return it != m_msCookies.end() ? it->second : "";
}
void CHTTPSock::CheckPost() {
if (m_sPostData.size() >= m_uPostLen) {
ParseParams(m_sPostData.Left(m_uPostLen));
@@ -70,6 +88,16 @@ void CHTTPSock::ReadLine(const CString& sData) {
m_bPost = true;
m_sURI = sLine.Token(1);
ParseURI();
} else if (sName.Equals("Cookie:")) {
VCString vsNV;
sLine.Token(1, true).Split(";", vsNV, false, "", "", true, true);
for (unsigned int a = 0; a < vsNV.size(); a++) {
CString s(vsNV[a]);
SetCookie(s.Token(0, false, "=").Escape_n(CString::EURL, CString::EASCII), s.Token(1, true, "=").Escape_n(CString::EURL, CString::EASCII));
}
} else if (sName.Equals("Authorization:")) {
CString sUnhashed;
sLine.Token(2).Base64Decode(sUnhashed);
@@ -405,7 +433,13 @@ bool CHTTPSock::PrintHeader(off_t uContentLength, const CString& sContentType, u
}
Write("Content-Type: " + m_sContentType + "\r\n");
for (MCString::iterator it = m_msHeaders.begin(); it != m_msHeaders.end(); ++it) {
MCString::iterator it;
for (it = m_msCookies.begin(); it != m_msCookies.end(); ++it) {
Write("Set-Cookie: " + it->first.Escape_n(CString::EURL) + "=" + it->second.Escape_n(CString::EURL) + "; path=/;\r\n");
}
for (it = m_msHeaders.begin(); it != m_msHeaders.end(); ++it) {
Write(it->first + ": " + it->second + "\r\n");
}