#include "remote/apiuser.hpp"
#include "remote/apiuser-ti.cpp"
#include "base/configtype.hpp"
+#include "base/base64.hpp"
+ #include "base/tlsutility.hpp"
using namespace icinga;
return nullptr;
}
- /* Deny authentication if 1) given password is empty 2) configured password does not match. */
- if (password.IsEmpty())
- return nullptr;
- else if (user && user->GetPassword() != password)
+ApiUser::Ptr ApiUser::GetByAuthHeader(const String& auth_header)
+{
+ String::SizeType pos = auth_header.FindFirstOf(" ");
+ String username, password;
+
+ if (pos != String::NPos && auth_header.SubStr(0, pos) == "Basic") {
+ String credentials_base64 = auth_header.SubStr(pos + 1);
+ String credentials = Base64::Decode(credentials_base64);
+
+ String::SizeType cpos = credentials.FindFirstOf(":");
+
+ if (cpos != String::NPos) {
+ username = credentials.SubStr(0, cpos);
+ password = credentials.SubStr(cpos + 1);
+ }
+ }
+
+ const ApiUser::Ptr& user = ApiUser::GetByName(username);
+
++ /* Deny authentication if:
++ * 1) user does not exist
++ * 2) given password is empty
++ * 2) configured password does not match.
++ */
++ if (!user || password.IsEmpty())
+ return nullptr;
++ else if (user && user->GetPassword() != password) {
++ Dictionary::Ptr passwordDict = user->GetPasswordDict();
++ if (!passwordDict || !ComparePassword(passwordDict->Get("password"), password, passwordDict->Get("salt")))
++ return nullptr;
++ }
+
+ return user;
+}
++
+ Dictionary::Ptr ApiUser::GetPasswordDict(void) const
+ {
+ String password = GetPasswordHash();
+ if (password.IsEmpty() || password[0] != '$')
+ return nullptr;
+
+ String::SizeType saltBegin = password.FindFirstOf('$', 1);
+ String::SizeType passwordBegin = password.FindFirstOf('$', saltBegin+1);
+
+ if (saltBegin == String::NPos || saltBegin == 1 || passwordBegin == String::NPos)
+ return nullptr;
+
+ Dictionary::Ptr passwordDict = new Dictionary();
+ passwordDict->Set("algorithm", password.SubStr(1, saltBegin - 1));
+ passwordDict->Set("salt", password.SubStr(saltBegin + 1, passwordBegin - saltBegin - 1));
+ passwordDict->Set("password", password.SubStr(passwordBegin + 1));
+
+ return passwordDict;
+ }