Files
neutrino/src/nhttpd/yhttpd_mods/mod_auth.cpp
2012-11-28 19:03:03 +01:00

109 lines
3.6 KiB
C++

//=============================================================================
// YHTTPD
// TestHook
//=============================================================================
#include <cstring>
#include <cstdlib>
#include "mod_auth.h"
#include <helper.h>
//-----------------------------------------------------------------------------
// HOOK: response_hook
//-----------------------------------------------------------------------------
THandleStatus CmAuth::Hook_PrepareResponse(CyhookHandler *hh) {
THandleStatus status = HANDLED_CONTINUE;
if (authenticate) {
if ((hh->UrlData["clientaddr"]).find(IADDR_LOCAL) > 0
&& (no_auth_client == "" || (hh->UrlData["clientaddr"]).find(
no_auth_client) > 0)) // dont check local calls or calls from NoAuthClient
{
if (!CheckAuth(hh)) {
hh->SetError(HTTP_UNAUTHORIZED);
status = HANDLED_ERROR;
}
}
}
return status;
}
//-----------------------------------------------------------------------------
// HOOK: webserver_readconfig_hook Handler
// This hook ist called from ReadConfig
//-----------------------------------------------------------------------------
THandleStatus CmAuth::Hook_ReadConfig(CConfigFile *Config,
CStringList &ConfigList) {
username = Config->getString("mod_auth.username", AUTHUSER);
password = Config->getString("mod_auth.password", AUTHPASSWORD);
no_auth_client = Config->getString("mod_auth.no_auth_client", "");
authenticate = Config->getBool("mod_auth.authenticate", false);
ConfigList["mod_auth.username"] = username;
ConfigList["mod_auth.password"] = password;
ConfigList["mod_auth.no_auth_client"] = no_auth_client;
ConfigList["mod_auth.authenticate"] = Config->getString(
"mod_auth.authenticate", "false");
return HANDLED_CONTINUE;
}
//-----------------------------------------------------------------------------
// check if given username an pssword are valid
//-----------------------------------------------------------------------------
bool CmAuth::CheckAuth(CyhookHandler *hh) {
if (hh->HeaderList["Authorization"] == "")
return false;
std::string encodet = hh->HeaderList["Authorization"].substr(6,
hh->HeaderList["Authorization"].length() - 6);
std::string decodet = decodeBase64(encodet.c_str());
int pos = decodet.find_first_of(':');
std::string user = decodet.substr(0, pos);
std::string passwd = decodet.substr(pos + 1, decodet.length() - pos - 1);
return (user.compare(username) == 0 && passwd.compare(password) == 0);
}
//-----------------------------------------------------------------------------
// decode Base64 buffer to String
//-----------------------------------------------------------------------------
std::string CmAuth::decodeBase64(const char *b64buffer) {
char *newString; //shorter then b64buffer
std::string result;
if ((newString = (char *) malloc(sizeof(char) * strlen(b64buffer) + 1))
!= NULL) {
char *org_newString = newString;
int i = 0;
unsigned long c = 0;
while (*b64buffer) {
int oneChar = *b64buffer++;
if (oneChar >= '0' && oneChar <= '9')
oneChar = oneChar - '0' + 52;
else if (oneChar >= 'A' && oneChar <= 'Z')
oneChar = oneChar - 'A';
else if (oneChar >= 'a' && oneChar <= 'z')
oneChar = oneChar - 'a' + 26;
else if (oneChar == '+')
oneChar = 62;
else if (oneChar == '/')
oneChar = 63;
else if (oneChar == '=')
oneChar = 0;
else
continue;
c = (c << 6) | oneChar;
if (++i == 4) {
*newString++ = (char) (c >> 16);
*newString++ = (char) (c >> 8);
*newString++ = (char) c;
i = 0;
}
}
*newString++ = '\0';
result = std::string(org_newString);
free(org_newString);
return result;
} else
return "";
}