Update UniFi Login
This commit is contained in:
+71
-11
@@ -2,6 +2,7 @@
|
||||
#include <json.hpp>
|
||||
#include <Logging.h>
|
||||
#include <algorithm>
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
|
||||
|
||||
@@ -9,6 +10,7 @@ namespace PresenceDetection {
|
||||
namespace WiFi {
|
||||
|
||||
Driver::Driver(const std::string& hostname, int port, const std::string& username, const std::string& password, const std::string& cookieFile, int timeout, const std::string& inventoryURL, const std::string& target, const std::vector<Util::StaticDevice>& staticDevices) :
|
||||
m_httpClient(5),
|
||||
m_loggedIn(false),
|
||||
m_hostname(hostname),
|
||||
m_port(port),
|
||||
@@ -57,7 +59,7 @@ void Driver::Wait()
|
||||
bool Driver::Login()
|
||||
{
|
||||
std::stringstream url;
|
||||
url << "https://" << m_hostname << ":" << m_port << "/api/login";
|
||||
url << "https://" << m_hostname << ":" << m_port << "/api/auth/login";
|
||||
|
||||
nlohmann::json json;
|
||||
json["password"] = m_password;
|
||||
@@ -78,7 +80,7 @@ bool Driver::Login()
|
||||
|
||||
nlohmann::json outputJSON = nlohmann::json::parse(output);
|
||||
|
||||
if (outputJSON["meta"]["rc"] != "ok")
|
||||
if (outputJSON["code"] == "AUTHENTICATION_FAILED_INVALID_CREDENTIALS")
|
||||
{
|
||||
std::stringstream error;
|
||||
error << "Login Failed - " << output.str();
|
||||
@@ -102,12 +104,14 @@ bool Driver::Login()
|
||||
|
||||
void Driver::Logout()
|
||||
{
|
||||
std::stringstream url;
|
||||
url << "https://" << m_hostname << ":" << m_port << "/logout";
|
||||
// std::stringstream url;
|
||||
// url << "https://" << m_hostname << ":" << m_port << "/api/auth/logout";
|
||||
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
m_loggedIn = false;
|
||||
|
||||
ClearCookiesFile();
|
||||
/*
|
||||
try
|
||||
{
|
||||
Http::HttpRequest request(url.str());
|
||||
@@ -121,6 +125,7 @@ void Driver::Logout()
|
||||
ss << "WiFi::Driver::Logout() - Error: " << e.what() << std::endl;
|
||||
Logging::Log(Logging::Severity::Error, ss.str());
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
void Driver::ClearDevices()
|
||||
@@ -195,10 +200,10 @@ void Driver::UpdatePresentDevices()
|
||||
return;
|
||||
|
||||
std::stringstream url;
|
||||
url << "https://" << m_hostname << ":" << m_port << "/api/s/default/stat/sta";
|
||||
url << "https://" << m_hostname << ":" << m_port << "/proxy/network/api/s/default/stat/sta";
|
||||
|
||||
std::time_t timeStamp = std::time(nullptr);
|
||||
std::vector<std::string> presentDevices;
|
||||
std::vector<PresentDevice> presentDevices;
|
||||
std::vector<std::string> addedDevices;
|
||||
std::vector<std::string> removedDevices;
|
||||
|
||||
@@ -210,6 +215,7 @@ void Driver::UpdatePresentDevices()
|
||||
output << m_httpClient.Open(request);
|
||||
|
||||
nlohmann::json json = nlohmann::json::parse(output);
|
||||
//Logging::Log(Logging::Severity::Debug, output.str());
|
||||
|
||||
if (json["meta"]["rc"] != "ok")
|
||||
{
|
||||
@@ -235,7 +241,7 @@ void Driver::UpdatePresentDevices()
|
||||
ss << "Device Added: " << device.dump() << std::endl;
|
||||
Logging::Log(Logging::Severity::Info, ss.str());
|
||||
}
|
||||
presentDevices.push_back(macAddress);
|
||||
presentDevices.push_back(PresentDevice(macAddress, 0));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -256,7 +262,7 @@ void Driver::UpdatePresentDevices()
|
||||
{
|
||||
if (std::find(m_presentDevices.begin(), m_presentDevices.end(), macAddress) == m_presentDevices.end())
|
||||
addedDevices.push_back(macAddress);
|
||||
presentDevices.push_back(macAddress);
|
||||
presentDevices.push_back(PresentDevice(macAddress, 0));
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -274,15 +280,22 @@ void Driver::UpdatePresentDevices()
|
||||
catch (const std::exception& e)
|
||||
{
|
||||
std::stringstream ss;
|
||||
ss << "WiFi::Driver::IsDevicePresent() - Error: " << e.what() << std::endl;
|
||||
ss << "WiFi::Driver::UpdatePresentDevices() - Error: " << e.what() << std::endl;
|
||||
Logging::Log(Logging::Severity::Error, ss.str());
|
||||
Logout();
|
||||
return;
|
||||
}
|
||||
|
||||
for (std::vector<std::string>::iterator it = m_presentDevices.begin(); it != m_presentDevices.end(); ++it)
|
||||
for (std::vector<PresentDevice>::iterator it = m_presentDevices.begin(); it != m_presentDevices.end(); ++it)
|
||||
{
|
||||
if (std::find(presentDevices.begin(), presentDevices.end(), *it) == presentDevices.end())
|
||||
removedDevices.push_back(*it);
|
||||
{
|
||||
removedDevices.push_back((*it).MacAddress);
|
||||
std::stringstream ss;
|
||||
ss << "Device Removed: " << (*it).MacAddress << std::endl;
|
||||
Logging::Log(Logging::Severity::Info, ss.str());
|
||||
}
|
||||
}
|
||||
|
||||
for (std::vector<std::string>::iterator it = addedDevices.begin(); it != addedDevices.end(); ++it)
|
||||
SendStateChange(true, *it);
|
||||
@@ -366,5 +379,52 @@ void Driver::SendStateChange(bool present, const std::string& macAddress)
|
||||
}
|
||||
}
|
||||
|
||||
void Driver::ClearCookiesFile()
|
||||
{
|
||||
std::ifstream file;
|
||||
|
||||
file.open(m_cookieFile.c_str(), std::ifstream::out | std::ifstream::trunc);
|
||||
if (!file.is_open() || file.fail())
|
||||
{
|
||||
file.close();
|
||||
|
||||
std::stringstream ss;
|
||||
ss << "WiFi::Driver::ClearCookiesFile() - Error: Failed to erase file content." << std::endl;
|
||||
Logging::Log(Logging::Severity::Error, ss.str());
|
||||
}
|
||||
file.close();
|
||||
}
|
||||
|
||||
Driver::PresentDevice::PresentDevice(const std::string& macAddress) :
|
||||
MacAddress(macAddress)
|
||||
{
|
||||
}
|
||||
|
||||
Driver::PresentDevice::PresentDevice(const std::string& macAddress, int lastSeen) :
|
||||
MacAddress(macAddress),
|
||||
LastSeen(lastSeen)
|
||||
{
|
||||
}
|
||||
|
||||
bool Driver::PresentDevice::operator==(const Driver::PresentDevice& other) const
|
||||
{
|
||||
return MacAddress == other.MacAddress;
|
||||
}
|
||||
|
||||
bool Driver::PresentDevice::operator!=(const Driver::PresentDevice& other) const
|
||||
{
|
||||
return !(*this == other);
|
||||
}
|
||||
|
||||
bool Driver::PresentDevice::operator==(const std::string& other) const
|
||||
{
|
||||
return MacAddress == other;
|
||||
}
|
||||
|
||||
bool Driver::PresentDevice::operator!=(const std::string& other) const
|
||||
{
|
||||
return !(*this == other);
|
||||
}
|
||||
|
||||
} // namespace WiFi
|
||||
} // namespace PresenceDetection
|
||||
|
||||
+19
-1
@@ -31,6 +31,24 @@ private:
|
||||
void UpdatePresentDevices();
|
||||
void SendStateChange(bool present, const std::string& macAddress);
|
||||
|
||||
void ClearCookiesFile();
|
||||
|
||||
private:
|
||||
struct PresentDevice
|
||||
{
|
||||
PresentDevice(const std::string& macAddress);
|
||||
PresentDevice(const std::string& macAddress, int lastSeen);
|
||||
|
||||
std::string MacAddress;
|
||||
int LastSeen;
|
||||
|
||||
bool operator==(const PresentDevice& other) const;
|
||||
bool operator!=(const PresentDevice& other) const;
|
||||
|
||||
bool operator==(const std::string& other) const;
|
||||
bool operator!=(const std::string& other) const;
|
||||
};
|
||||
|
||||
private:
|
||||
Timer::Timer m_deviceTimer;
|
||||
Timer::Timer m_inventoryTimer;
|
||||
@@ -52,7 +70,7 @@ private:
|
||||
std::string m_target;
|
||||
std::vector<Util::StaticDevice> m_staticDevices;
|
||||
|
||||
std::vector<std::string> m_presentDevices;
|
||||
std::vector<PresentDevice> m_presentDevices;
|
||||
};
|
||||
|
||||
} // namespace WiFi
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#ifndef WIFI_FUNCTIONS_H
|
||||
#define WIFI_FUNCTIONS_H
|
||||
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user