31 const std::filesystem::path& path,
33 const std::string& nameServer);
38 std::shared_ptr<dht::crypto::Certificate>
ca;
42 std::string deviceName,
43 std::unique_ptr<AccountCredentials> credentials,
60 std::string_view scheme,
61 const std::string& password,
66 std::string_view scheme,
67 const std::string& password,
75 std::string accountId;
78 std::string deviceName;
79 std::unique_ptr<ServerAccountCredentials> credentials;
84 const std::string managerHostname_;
85 std::shared_ptr<dht::Logger> logger_;
87 std::mutex requestLock_;
88 std::set<std::shared_ptr<dht::http::Request>> requests_;
89 std::unique_ptr<ServerAccountCredentials> creds_;
91 void sendRequest(
const std::shared_ptr<dht::http::Request>& request);
92 void clearRequest(
const std::weak_ptr<dht::http::Request>& request);
94 enum class TokenScope :
unsigned { None = 0, Device, User, Admin };
95 std::mutex tokenLock_;
96 std::string token_ {};
97 TokenScope tokenScope_ {};
98 std::chrono::steady_clock::time_point tokenExpire_ {std::chrono::steady_clock::time_point::min()};
100 using RequestQueue = std::queue<std::shared_ptr<dht::http::Request>>;
101 RequestQueue pendingDeviceRequests_;
102 RequestQueue pendingAccountRequests_;
103 RequestQueue& getRequestQueue(TokenScope
scope)
105 return scope == TokenScope::Device ? pendingDeviceRequests_ : pendingAccountRequests_;
107 bool hasAuthorization(TokenScope
scope)
const
109 return not token_.empty()
and tokenScope_ >=
scope and tokenExpire_ >= std::chrono::steady_clock::now();
111 void setAuthHeaderFields(dht::http::Request& request)
const;
113 void sendDeviceRequest(
const std::shared_ptr<dht::http::Request>& req);
114 void sendAccountRequest(
const std::shared_ptr<dht::http::Request>& req,
const std::string& password);
116 void authenticateDevice();
117 void authenticateAccount(
const std::string& username,
const std::string& password);
118 void authFailed(TokenScope
scope,
int code);
119 void authError(TokenScope
scope);
120 void onAuthEnded(
const Json::Value& json,
const dht::http::Response& response, TokenScope
scope);
121 std::function<
void()> onNeedsMigration_;
123 void setToken(std::string token, TokenScope
scope, std::chrono::steady_clock::time_point
expiration);
void initAuthentication(PrivateKey request, std::string deviceName, std::unique_ptr< AccountCredentials > credentials, AuthSuccessCallback onSuccess, AuthFailureCallback onFailure, const OnChangeCallback &onChange) override