#include #include #include #include #include #include namespace nntpchan { HashedCredDB::HashedCredDB() : LineReader(1024) {} bool HashedCredDB::CheckLogin(const std::string & user, const std::string & passwd) { std::unique_lock lock(m_access); m_found = false; m_user = user; m_passwd = passwd; m_instream->seekg(0, std::ios::end); const auto l = m_instream->tellg(); m_instream->seekg(0, std::ios::beg); char * buff = new char[l]; // read file m_instream->read(buff, l); Data(buff, l); delete [] buff; return m_found; } bool HashedCredDB::ProcessLine(const std::string & line) { // strip comments auto comment = line.find("#"); std::string part = line; for (; comment != std::string::npos; comment = part.find("#")) { if(comment) part = part.substr(0, comment); else break; } if(!part.size()) return false; // empty line after comments auto idx = part.find(":"); if (idx == std::string::npos) return false; // bad format if (m_user != part.substr(0, idx)) return false; // username mismatch part = part.substr(idx+1); idx = part.find(":"); if (idx == std::string::npos) return false; // bad format std::string cred = part.substr(0, idx); std::string salt = part.substr(idx+1); return Hash(m_passwd, salt) == cred; } void HashedCredDB::HandleLine(const std::string &line) { if(m_found) return; if(ProcessLine(line)) m_found = true; } void HashedCredDB::SetStream(std::istream * s) { m_instream = s; } std::string HashedCredDB::Hash(const std::string & data, const std::string & salt) { SHA512Digest h; std::string d = data + salt; SHA512((const uint8_t*)d.c_str(), d.size(), h); return B64Encode(h.data(), h.size()); } HashedFileDB::HashedFileDB(const std::string & fname) : m_fname(fname), f(nullptr) { } HashedFileDB::~HashedFileDB() { } void HashedFileDB::Close() { if(f.is_open()) f.close(); } bool HashedFileDB::Open() { if(!f.is_open()) f.open(m_fname); if(f.is_open()) { SetStream(&f); return true; } return false; } }