mirror of
https://github.com/openappsec/openappsec.git
synced 2025-09-29 19:24:26 +03:00
April 21th 2024 update
This commit is contained in:
@@ -244,7 +244,7 @@ private:
|
||||
dbgTrace(D_CONFIG) << "File system path reloaded: " << config_directory_path;
|
||||
}
|
||||
|
||||
void
|
||||
bool
|
||||
sendOrchestatorReloadStatusMsg(const LoadNewConfigurationStatus &status)
|
||||
{
|
||||
I_Messaging *messaging = Singleton::Consume<I_Messaging>::by<ConfigComponent>();
|
||||
@@ -262,7 +262,7 @@ private:
|
||||
MessageMetadata secondary_port_req_md("127.0.0.1", 7778);
|
||||
secondary_port_req_md.setConnectioFlag(MessageConnectionConfig::ONE_TIME_CONN);
|
||||
secondary_port_req_md.setConnectioFlag(MessageConnectionConfig::UNSECURE_CONN);
|
||||
messaging->sendSyncMessageWithoutResponse(
|
||||
service_config_status = messaging->sendSyncMessageWithoutResponse(
|
||||
HTTPMethod::POST,
|
||||
"/set-reconf-status",
|
||||
status,
|
||||
@@ -270,6 +270,11 @@ private:
|
||||
secondary_port_req_md
|
||||
);
|
||||
}
|
||||
if (!service_config_status) {
|
||||
dbgWarning(D_CONFIG) << "Unsuccessful attempt to send configuration reload status";
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
unordered_map<TenantProfilePair, map<vector<string>, PerContextValue>> configuration_nodes;
|
||||
@@ -935,7 +940,15 @@ ConfigComponent::Impl::reloadConfigurationContinuesWrapper(const string &version
|
||||
mainloop->stop(routine_id);
|
||||
LoadNewConfigurationStatus finished(id, service_name, !res, true);
|
||||
if (!res) finished.setError("Failed to reload configuration");
|
||||
sendOrchestatorReloadStatusMsg(finished);
|
||||
I_TimeGet *time = Singleton::Consume<I_TimeGet>::by<ConfigComponent>();
|
||||
auto send_status_time_out = time->getMonotonicTime() + chrono::seconds(180);
|
||||
while (time->getMonotonicTime() < send_status_time_out) {
|
||||
if (sendOrchestatorReloadStatusMsg(finished)) break;
|
||||
mainloop->yield(chrono::seconds(1));
|
||||
}
|
||||
if (time->getMonotonicTime() >= send_status_time_out) {
|
||||
dbgWarning(D_CONFIG) << "Failed to send configuration reload status(finish) to the orchestrator";
|
||||
}
|
||||
|
||||
is_continuous_report = false;
|
||||
}
|
||||
|
@@ -24,6 +24,7 @@ enum AttachmentType
|
||||
NGINX_ATT_ID,
|
||||
PRELOAD_ATT_ID,
|
||||
SQUID_ATT_ID,
|
||||
ENVOY_ATT_ID,
|
||||
#ifdef __cplusplus
|
||||
COUNT
|
||||
#endif
|
||||
|
@@ -17,7 +17,7 @@
|
||||
#include <string>
|
||||
#include <stdbool.h>
|
||||
|
||||
enum class EnvType { LINUX, K8S, COUNT };
|
||||
enum class EnvType { LINUX, DOCKER, K8S, NON_CRD_K8S, COUNT };
|
||||
|
||||
class I_EnvDetails
|
||||
{
|
||||
|
@@ -21,6 +21,8 @@
|
||||
#include "intelligence_is_v2/intelligence_response.h"
|
||||
#include "intelligence_is_v2/intelligence_types_v2.h"
|
||||
#include "intelligence_is_v2/query_request_v2.h"
|
||||
#include "messaging/messaging_enums.h"
|
||||
#include "messaging/messaging_metadata.h"
|
||||
#include "maybe_res.h"
|
||||
|
||||
namespace Intelligence {
|
||||
@@ -43,18 +45,29 @@ public:
|
||||
getResponse(
|
||||
const std::vector<QueryRequest> &query_requests,
|
||||
bool is_pretty,
|
||||
bool is_bulk
|
||||
bool is_bulk,
|
||||
const MessageMetadata &req_md
|
||||
) const = 0;
|
||||
|
||||
virtual Maybe<Intelligence::Response> getResponse(const QueryRequest &query_request, bool is_pretty) const = 0;
|
||||
virtual Maybe<Intelligence::Response>
|
||||
getResponse(const QueryRequest &query_request, bool is_pretty, const MessageMetadata &req_md) const = 0;
|
||||
|
||||
template<typename Data>
|
||||
Maybe<std::vector<AssetReply<Data>>>
|
||||
queryIntelligence(QueryRequest &query_request, bool ignore_in_progress = false, bool is_pretty = true);
|
||||
queryIntelligence(
|
||||
QueryRequest &query_request,
|
||||
bool ignore_in_progress = false,
|
||||
bool is_pretty = true,
|
||||
MessageMetadata req_md = MessageMetadata("", 0)
|
||||
);
|
||||
|
||||
template<typename Data>
|
||||
Maybe<std::vector<Maybe<std::vector<AssetReply<Data>>>>>
|
||||
queryIntelligence(std::vector<QueryRequest> &query_requests, bool is_pretty = true);
|
||||
queryIntelligence(
|
||||
std::vector<QueryRequest> &query_requests,
|
||||
bool is_pretty = true,
|
||||
MessageMetadata req_md = MessageMetadata("", 0)
|
||||
);
|
||||
|
||||
protected:
|
||||
virtual ~I_Intelligence_IS_V2() {}
|
||||
|
@@ -76,7 +76,7 @@ public:
|
||||
MessageMetadata message_metadata = MessageMetadata()
|
||||
) = 0;
|
||||
|
||||
virtual Maybe<HTTPStatusCode, HTTPResponse> downloadFile(
|
||||
virtual Maybe<void, HTTPResponse> downloadFile(
|
||||
const HTTPMethod method,
|
||||
const std::string &uri,
|
||||
const std::string &download_file_path,
|
||||
@@ -84,7 +84,7 @@ public:
|
||||
MessageMetadata message_metadata = MessageMetadata()
|
||||
) = 0;
|
||||
|
||||
virtual Maybe<HTTPStatusCode, HTTPResponse> uploadFile(
|
||||
virtual Maybe<void, HTTPResponse> uploadFile(
|
||||
const std::string & uri,
|
||||
const std::string & upload_file_path,
|
||||
const MessageCategory category = MessageCategory::GENERIC,
|
||||
|
@@ -20,9 +20,14 @@
|
||||
|
||||
template <typename Data>
|
||||
Maybe<std::vector<AssetReply<Data>>>
|
||||
I_Intelligence_IS_V2::queryIntelligence(QueryRequest &query_request, bool ignore_in_progress, bool is_pretty)
|
||||
I_Intelligence_IS_V2::queryIntelligence(
|
||||
QueryRequest &query_request,
|
||||
bool ignore_in_progress,
|
||||
bool is_pretty,
|
||||
MessageMetadata req_md
|
||||
)
|
||||
{
|
||||
auto response = getResponse(query_request, is_pretty);
|
||||
auto response = getResponse(query_request, is_pretty, req_md);
|
||||
|
||||
if (!response.ok()) return response.passErr();
|
||||
auto serializable_response = response->getSerializableResponse<Data>();
|
||||
@@ -39,9 +44,13 @@ I_Intelligence_IS_V2::queryIntelligence(QueryRequest &query_request, bool ignore
|
||||
|
||||
template<typename Data>
|
||||
Maybe<std::vector<Maybe<std::vector<AssetReply<Data>>>>>
|
||||
I_Intelligence_IS_V2::queryIntelligence(std::vector<QueryRequest> &query_requests, bool is_pretty)
|
||||
I_Intelligence_IS_V2::queryIntelligence(
|
||||
std::vector<QueryRequest> &query_requests,
|
||||
bool is_pretty,
|
||||
MessageMetadata req_md
|
||||
)
|
||||
{
|
||||
auto res = getResponse(query_requests, is_pretty, true);
|
||||
auto res = getResponse(query_requests, is_pretty, true, req_md);
|
||||
if (!res.ok()) return res.passErr();
|
||||
|
||||
return res->getBulkData<Data>();
|
||||
|
@@ -26,11 +26,19 @@ public:
|
||||
MOCK_CONST_METHOD1(sendInvalidation, bool(const Invalidation &invalidation));
|
||||
MOCK_METHOD2(registerInvalidation, Maybe<uint>(const Invalidation &invalidation, const InvalidationCb &callback));
|
||||
MOCK_METHOD1(unregisterInvalidation, void(uint id));
|
||||
MOCK_CONST_METHOD4(
|
||||
getResponse,
|
||||
Maybe<Response>(
|
||||
const std::vector<QueryRequest> &query_requests,
|
||||
bool is_pretty,
|
||||
bool is_bulk,
|
||||
const MessageMetadata &req_md
|
||||
)
|
||||
);
|
||||
MOCK_CONST_METHOD3(
|
||||
getResponse,
|
||||
Maybe<Response>(const std::vector<QueryRequest> &query_requests, bool is_pretty, bool is_bulk)
|
||||
Maybe<Response>(const QueryRequest &query_request, bool is_pretty, const MessageMetadata &req_md)
|
||||
);
|
||||
MOCK_CONST_METHOD2(getResponse, Maybe<Response>(const QueryRequest &query_request, bool is_pretty));
|
||||
MOCK_CONST_METHOD0(getIsOfflineOnly, bool(void));
|
||||
MOCK_CONST_METHOD1(getOfflineInfoString, Maybe<std::string>(const SerializableQueryFilter &query));
|
||||
};
|
||||
|
@@ -32,7 +32,7 @@ public:
|
||||
|
||||
MOCK_METHOD5(
|
||||
downloadFile,
|
||||
Maybe<HTTPStatusCode, HTTPResponse> (
|
||||
Maybe<void, HTTPResponse> (
|
||||
HTTPMethod,
|
||||
const string &,
|
||||
const string &,
|
||||
@@ -43,7 +43,7 @@ public:
|
||||
|
||||
MOCK_METHOD4(
|
||||
uploadFile,
|
||||
Maybe<HTTPStatusCode, HTTPResponse> (
|
||||
Maybe<void, HTTPResponse> (
|
||||
const string &,
|
||||
const string &,
|
||||
MessageCategory,
|
||||
@@ -62,10 +62,4 @@ operator<<(std::ostream &os, const HTTPResponse &)
|
||||
return os;
|
||||
}
|
||||
|
||||
static std::ostream &
|
||||
operator<<(std::ostream &os, const HTTPStatusCode &)
|
||||
{
|
||||
return os;
|
||||
}
|
||||
|
||||
#endif // __MOCK_MESSAGING_H__
|
||||
|
@@ -149,7 +149,7 @@ DEFINE_FLAG(D_COMPONENT, D_ALL)
|
||||
DEFINE_FLAG(D_UPSTREAM_KEEPALIVE, D_REVERSE_PROXY)
|
||||
DEFINE_FLAG(D_FORWARD_PROXY, D_REVERSE_PROXY)
|
||||
|
||||
DEFINE_FLAG(D_IDA_SAML, D_COMPONENT)
|
||||
DEFINE_FLAG(D_IDA, D_COMPONENT)
|
||||
|
||||
DEFINE_FLAG(D_IOT_NEXT, D_COMPONENT)
|
||||
DEFINE_FLAG(D_IOT_AUXILIARY, D_IOT_NEXT)
|
||||
|
@@ -70,7 +70,7 @@ public:
|
||||
std::vector<StrAttributes> getAttributes() const { return attributes; }
|
||||
const Maybe<std::string, void> & getSourceId() const { return source_id; }
|
||||
const Maybe<ObjectType, void> & getObjectType() const { return object_type; }
|
||||
InvalidationType getInvalidationType() const { return invalidation_type; }
|
||||
const Maybe<InvalidationType, void> & getInvalidationType() const { return invalidation_type; }
|
||||
Maybe<std::string, void> getRegistrationID() const;
|
||||
|
||||
bool report(I_Intelligence_IS_V2 *interface) const;
|
||||
@@ -92,7 +92,7 @@ private:
|
||||
std::vector<StrAttributes> attributes;
|
||||
Maybe<std::string, void> source_id;
|
||||
Maybe<ObjectType, void> object_type;
|
||||
InvalidationType invalidation_type = InvalidationType::ADD;
|
||||
Maybe<InvalidationType, void> invalidation_type;
|
||||
Maybe<uint, void> listening_id;
|
||||
Maybe<std::string, void> registration_id;
|
||||
};
|
||||
|
@@ -68,6 +68,7 @@ enum class Tags {
|
||||
API_DISCOVERY,
|
||||
NGINX_PROXY_MANAGER,
|
||||
WEB_SERVER_APISIX,
|
||||
DEPLOYMENT_DOCKER,
|
||||
|
||||
COUNT
|
||||
};
|
||||
|
@@ -34,6 +34,10 @@ ValidBulkQueryResponse::serialize(cereal::JSONInputArchive &ar)
|
||||
void
|
||||
IntelligenceQueryBulkResponse::serialize(cereal::JSONInputArchive &ar)
|
||||
{
|
||||
ar(cereal::make_nvp("errors", errors));
|
||||
ar(cereal::make_nvp("queriesResponse", valid_responses));
|
||||
try {
|
||||
ar(cereal::make_nvp("errors", errors));
|
||||
} catch (const cereal::Exception &e) {
|
||||
ar.setNextName(nullptr);
|
||||
}
|
||||
}
|
||||
|
@@ -14,6 +14,8 @@
|
||||
#ifndef __INTELLIGENCE_REQUEST_H__
|
||||
#define __INTELLIGENCE_REQUEST_H__
|
||||
#include "intelligence_is_v2/query_request_v2.h"
|
||||
#include "messaging/messaging_enums.h"
|
||||
#include "messaging/messaging_metadata.h"
|
||||
|
||||
#include <vector>
|
||||
#include "maybe_res.h"
|
||||
@@ -23,9 +25,14 @@ namespace Intelligence {
|
||||
class IntelligenceRequest : ClientRest
|
||||
{
|
||||
public:
|
||||
IntelligenceRequest(const std::vector<QueryRequest> &queries, bool is_pretty, bool is_bulk)
|
||||
IntelligenceRequest(
|
||||
const std::vector<QueryRequest> &queries,
|
||||
bool is_pretty,
|
||||
bool is_bulk,
|
||||
const MessageMetadata &req_md
|
||||
)
|
||||
:
|
||||
queries(queries), is_pretty(is_pretty), is_bulk(is_bulk)
|
||||
queries(queries), is_pretty(is_pretty), is_bulk(is_bulk), req_md(req_md)
|
||||
{}
|
||||
|
||||
Maybe<void> checkAssetsLimit() const;
|
||||
@@ -38,12 +45,14 @@ public:
|
||||
|
||||
size_t getSize() const { return queries.size(); }
|
||||
bool isBulk() const { return is_bulk; }
|
||||
const MessageMetadata & getReqMD() const { return req_md; }
|
||||
|
||||
private:
|
||||
const std::vector<QueryRequest> &queries;
|
||||
bool is_pretty = true;
|
||||
bool is_bulk = false;
|
||||
Maybe<std::string> response_from_fog = genError("Uninitialized");
|
||||
const MessageMetadata &req_md;
|
||||
};
|
||||
|
||||
}
|
||||
|
@@ -202,11 +202,26 @@ public:
|
||||
|
||||
if (objectType.isActive()) {
|
||||
auto type = object_names.find(objectType.get());
|
||||
if (type != object_names.end()) invalidation.setObjectType(type->second);
|
||||
if (type != object_names.end()) {
|
||||
invalidation.setObjectType(type->second);
|
||||
}
|
||||
else {
|
||||
dbgWarning(D_INTELLIGENCE) << "Received invalid object type: " << objectType.get();
|
||||
}
|
||||
}
|
||||
|
||||
if (sourceId.isActive()) invalidation.setSourceId(sourceId.get());
|
||||
|
||||
if (invalidationType.isActive()) {
|
||||
auto type = invalidation_type_names.find(invalidationType.get());
|
||||
if (type != invalidation_type_names.end()) {
|
||||
invalidation.setInvalidationType(type->second);
|
||||
}
|
||||
else {
|
||||
dbgWarning(D_INTELLIGENCE) << "Received invalid invalidation type: " << invalidationType.get();
|
||||
}
|
||||
}
|
||||
|
||||
string registration_id = "";
|
||||
if (invalidationRegistrationId.isActive()) registration_id = invalidationRegistrationId.get();
|
||||
|
||||
@@ -227,6 +242,7 @@ private:
|
||||
C2S_OPTIONAL_PARAM(string, invalidationRegistrationId);
|
||||
C2S_OPTIONAL_PARAM(vector<StrAttributes>, mainAttributes);
|
||||
C2S_OPTIONAL_PARAM(vector<StrAttributes>, attributes);
|
||||
C2S_OPTIONAL_PARAM(string, invalidationType);
|
||||
};
|
||||
|
||||
class IntelligenceComponentV2::Impl
|
||||
@@ -280,9 +296,14 @@ public:
|
||||
}
|
||||
|
||||
Maybe<Response>
|
||||
getResponse(const vector<QueryRequest> &query_requests, bool is_pretty, bool is_bulk) const override
|
||||
getResponse(
|
||||
const vector<QueryRequest> &query_requests,
|
||||
bool is_pretty,
|
||||
bool is_bulk,
|
||||
const MessageMetadata &req_md
|
||||
) const override
|
||||
{
|
||||
IntelligenceRequest intelligence_req(query_requests, is_pretty, is_bulk);
|
||||
IntelligenceRequest intelligence_req(query_requests, is_pretty, is_bulk, req_md);
|
||||
if (!intelligence_req.checkAssetsLimit().ok()) return intelligence_req.checkAssetsLimit().passErr();
|
||||
if (!intelligence_req.checkMinConfidence().ok()) return intelligence_req.checkMinConfidence().passErr();
|
||||
if (intelligence_req.isPagingActivated()) {
|
||||
@@ -297,10 +318,10 @@ public:
|
||||
}
|
||||
|
||||
Maybe<Intelligence::Response>
|
||||
getResponse(const QueryRequest &query_request, bool is_pretty) const override
|
||||
getResponse(const QueryRequest &query_request, bool is_pretty, const MessageMetadata &req_md) const override
|
||||
{
|
||||
vector<QueryRequest> queries = {query_request};
|
||||
return getResponse(queries, is_pretty, false);
|
||||
return getResponse(queries, is_pretty, false, req_md);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -312,6 +333,11 @@ private:
|
||||
if (!is_supported) {
|
||||
is_supported = getProfileAgentSettingWithDefault<bool>(false, "agent.config.supportInvalidation");
|
||||
}
|
||||
|
||||
if (!is_supported) {
|
||||
is_supported = getConfigurationWithDefault(false, "intelligence", "support Invalidation");
|
||||
}
|
||||
|
||||
return is_supported;
|
||||
}
|
||||
|
||||
@@ -390,7 +416,8 @@ private:
|
||||
auto tenant = details->getTenantId();
|
||||
if (tenant == "") tenant = "Global";
|
||||
headers["X-Tenant-Id"] = tenant;
|
||||
auto agent = details->getAgentId();
|
||||
auto rest = Singleton::Consume<I_RestApi>::by<IntelligenceComponentV2>();
|
||||
auto agent = details->getAgentId() + ":" + to_string(rest->getListeningPort());
|
||||
headers["X-Source-Id"] = agent;
|
||||
|
||||
return headers;
|
||||
@@ -474,6 +501,7 @@ IntelligenceComponentV2::preload()
|
||||
{
|
||||
registerExpectedConfiguration<uint>("intelligence", "maximum request overall time");
|
||||
registerExpectedConfiguration<uint>("intelligence", "maximum request lap time");
|
||||
registerExpectedConfiguration<bool>("intelligence", "support Invalidation");
|
||||
registerExpectedSetting<string>("intelligence", "local intelligence server ip");
|
||||
registerExpectedSetting<uint>("intelligence", primary_port_setting);
|
||||
registerExpectedSetting<uint>("intelligence", secondary_port_setting);
|
||||
|
@@ -126,7 +126,7 @@ TEST_F(IntelligenceComponentMockTest, getResponseErrorTest)
|
||||
QueryRequest request(Condition::EQUALS, "category", "cloud", true);
|
||||
|
||||
Maybe<Intelligence::Response> res_error = genError("Test error");
|
||||
EXPECT_CALL(intelligence_mock, getResponse(_, _)
|
||||
EXPECT_CALL(intelligence_mock, getResponse(_, _, _)
|
||||
).WillOnce(Return(res_error));
|
||||
|
||||
auto maybe_ans = intell->queryIntelligence<Profile>(request);
|
||||
@@ -180,7 +180,7 @@ TEST_F(IntelligenceComponentMockTest, getResponseTest)
|
||||
|
||||
Intelligence::Response response(response_str, 1, false);
|
||||
|
||||
EXPECT_CALL(intelligence_mock, getResponse(_, _)
|
||||
EXPECT_CALL(intelligence_mock, getResponse(_, _, _)
|
||||
).WillOnce(Return(response));
|
||||
|
||||
auto maybe_ans = intell->queryIntelligence<Profile>(request);
|
||||
@@ -341,7 +341,7 @@ TEST_F(IntelligenceComponentMockTest, bulkOnlineIntelligenceMockTest)
|
||||
);
|
||||
Intelligence::Response response(response_str, 4, true);
|
||||
|
||||
EXPECT_CALL(intelligence_mock, getResponse(_, _, _)
|
||||
EXPECT_CALL(intelligence_mock, getResponse(_, _, _, _)
|
||||
).WillOnce(Return(response));
|
||||
|
||||
auto maybe_ans = intell->queryIntelligence<Profile>(requests);
|
||||
|
@@ -24,7 +24,7 @@ USE_DEBUG_FLAG(D_INTELLIGENCE);
|
||||
TEST(IntelligenceQueryTestV2, genJsonPrettySingleRequest) {
|
||||
QueryRequest request(Condition::EQUALS, "phase", "testing", true);
|
||||
vector<QueryRequest> requests = {request};
|
||||
Intelligence::IntelligenceRequest query(requests, true, false);
|
||||
Intelligence::IntelligenceRequest query(requests, true, false, MessageMetadata("", 0));
|
||||
|
||||
std::string expected = "{\n"
|
||||
" \"limit\": 20,\n"
|
||||
@@ -42,7 +42,7 @@ TEST(IntelligenceQueryTestV2, genJsonPrettySingleRequest) {
|
||||
TEST(IntelligenceQueryTestV2, genJsonUnprettySingleRequest) {
|
||||
QueryRequest request(Condition::EQUALS, "phase", "testing", true);
|
||||
vector<QueryRequest> requests = {request};
|
||||
Intelligence::IntelligenceRequest query(requests, false, false);
|
||||
Intelligence::IntelligenceRequest query(requests, false, false, MessageMetadata("", 0));
|
||||
|
||||
std::string expected = "{"
|
||||
"\"limit\":20,"
|
||||
@@ -59,7 +59,7 @@ TEST(IntelligenceQueryTestV2, genJsonUnprettySingleRequest) {
|
||||
TEST(IntelligenceQueryTestV2, genJsonUnprettySingleRequestSpaces) {
|
||||
QueryRequest request(Condition::EQUALS, "ph ase", "te sti\" n g\\", true);
|
||||
vector<QueryRequest> requests = {request};
|
||||
Intelligence::IntelligenceRequest query(requests, false, false);
|
||||
Intelligence::IntelligenceRequest query(requests, false, false, MessageMetadata("", 0));
|
||||
std::string expected = "{"
|
||||
"\"limit\":20,"
|
||||
"\"fullResponse\":true,"
|
||||
@@ -76,7 +76,7 @@ TEST(IntelligenceQueryTestV2, genJsonPrettyBulkRequests) {
|
||||
QueryRequest request1(Condition::EQUALS, "phase", "testing", true);
|
||||
QueryRequest request2(Condition::EQUALS, "height", "testing", 25);
|
||||
std::vector<QueryRequest> requests = {request1, request2};
|
||||
Intelligence::IntelligenceRequest query(requests, true, true);
|
||||
Intelligence::IntelligenceRequest query(requests, true, true, MessageMetadata("", 0));
|
||||
|
||||
std::string expected = "{\n"
|
||||
" \"queries\": [\n"
|
||||
@@ -114,7 +114,7 @@ TEST(IntelligenceQueryTestV2, genJsonUnprettyBulkRequest) {
|
||||
QueryRequest request1(Condition::EQUALS, "phase", "testing", true);
|
||||
QueryRequest request2(Condition::EQUALS, "height", "testing", 25);
|
||||
std::vector<QueryRequest> requests = {request1, request2};
|
||||
Intelligence::IntelligenceRequest query(requests, false, true);
|
||||
Intelligence::IntelligenceRequest query(requests, false, true, MessageMetadata("", 0));
|
||||
|
||||
std::string expected = "{"
|
||||
"\"queries\":[{"
|
||||
|
@@ -117,12 +117,12 @@ TEST(InvalidationBasic, SettersAndGetters)
|
||||
EXPECT_EQ(invalidation.getClassifier(ClassifierType::GROUP), "");
|
||||
EXPECT_EQ(invalidation.getClassifier(ClassifierType::ORDER), "");
|
||||
EXPECT_EQ(invalidation.getClassifier(ClassifierType::KIND), "");
|
||||
EXPECT_EQ(invalidation.getInvalidationType(), InvalidationType::ADD);
|
||||
|
||||
EXPECT_TRUE(invalidation.getMainAttributes().empty());
|
||||
EXPECT_TRUE(invalidation.getAttributes().empty());
|
||||
EXPECT_FALSE(invalidation.getSourceId().ok());
|
||||
EXPECT_FALSE(invalidation.getObjectType().ok());
|
||||
EXPECT_FALSE(invalidation.getInvalidationType().ok());
|
||||
|
||||
set<string> main_vals = { "2", "3" };
|
||||
set<string> vals = { "5", "6" };
|
||||
@@ -152,7 +152,7 @@ TEST(InvalidationBasic, SettersAndGetters)
|
||||
EXPECT_EQ(invalidation.getAttributes().begin()->getStringSetAttr("attr2").unpack(), vals);
|
||||
EXPECT_EQ(invalidation.getSourceId().unpack(), "id");
|
||||
EXPECT_EQ(invalidation.getObjectType().unpack(), Intelligence::ObjectType::ASSET);
|
||||
EXPECT_EQ(invalidation.getInvalidationType(), InvalidationType::DELETE);
|
||||
EXPECT_EQ(invalidation.getInvalidationType().unpack(), InvalidationType::DELETE);
|
||||
}
|
||||
|
||||
TEST(InvalidationBasic, Matching)
|
||||
@@ -348,7 +348,6 @@ TEST_F(IntelligenceInvalidation, sending_public_invalidation)
|
||||
"\"category\": \"bbb\", "
|
||||
"\"family\": \"ccc\", "
|
||||
"\"objectType\": \"asset\", "
|
||||
"\"invalidationType\": \"add\", "
|
||||
"\"sourceId\": \"id\", "
|
||||
"\"mainAttributes\": [ { \"attr2\": \"2\" } ], "
|
||||
"\"attributes\": [ { \"attr3\": \"3\" } ]"
|
||||
@@ -389,7 +388,6 @@ TEST_F(IntelligenceInvalidation, multiple_assets_invalidation)
|
||||
"\"category\": \"bbb\", "
|
||||
"\"family\": \"ccc\", "
|
||||
"\"objectType\": \"asset\", "
|
||||
"\"invalidationType\": \"add\", "
|
||||
"\"sourceId\": \"id\", "
|
||||
"\"mainAttributes\": [ { \"attr2\": \"2\" }, { \"attr2\": \"22\", \"attr3\": [ \"33\", \"44\" ] } ], "
|
||||
"\"attributes\": [ { \"attr3\": \"3\" } ]"
|
||||
@@ -439,7 +437,6 @@ TEST_F(IntelligenceInvalidation, sending_private_invalidation)
|
||||
"\"category\": \"bbb\", "
|
||||
"\"family\": \"ccc\", "
|
||||
"\"objectType\": \"asset\", "
|
||||
"\"invalidationType\": \"add\", "
|
||||
"\"sourceId\": \"id\", "
|
||||
"\"mainAttributes\": [ { \"attr2\": \"2\" } ], "
|
||||
"\"attributes\": [ { \"attr3\": \"3\" } ]"
|
||||
|
@@ -142,7 +142,14 @@ Sender::sendMessage()
|
||||
{
|
||||
if (server_port.ok() && !server_ip.ok()) return genError("Can't send intelligence request. Server ip invalid");
|
||||
if (server_ip.ok() && !server_port.ok()) return genError("Can't send intelligence request. Server port invalid");
|
||||
auto req_md = server_ip.ok() ? MessageMetadata(*server_ip, *server_port, conn_flags) : MessageMetadata();
|
||||
|
||||
MessageMetadata req_md;
|
||||
if (server_ip.ok()) {
|
||||
req_md = MessageMetadata(*server_ip, *server_port, conn_flags);
|
||||
}
|
||||
else {
|
||||
req_md = request.getReqMD().getHostName().empty() ? MessageMetadata() : request.getReqMD();
|
||||
}
|
||||
|
||||
if (server_ip.ok()) {
|
||||
dbgTrace(D_INTELLIGENCE)
|
||||
|
@@ -27,6 +27,7 @@ Invalidation::Invalidation(const string &class_value)
|
||||
:
|
||||
source_id(genError<void>()),
|
||||
object_type(genError<void>()),
|
||||
invalidation_type(genError<void>()),
|
||||
listening_id(genError<void>()),
|
||||
registration_id(genError<void>())
|
||||
{
|
||||
@@ -133,7 +134,9 @@ Invalidation::genObject() const
|
||||
}
|
||||
|
||||
if (object_type.ok()) invalidation <<", \"objectType\": \"" << convertObjectType.at(*object_type) << '"';
|
||||
invalidation << ", \"invalidationType\": \"" << convertInvalidationType.at(invalidation_type) << '"';
|
||||
if (invalidation_type.ok()) {
|
||||
invalidation << ", \"invalidationType\": \"" << convertInvalidationType.at(*invalidation_type) << '"';
|
||||
}
|
||||
if (source_id.ok()) invalidation <<", \"sourceId\": \"" << *source_id << '"';
|
||||
if (registration_id.ok()) invalidation <<", \"invalidationRegistrationId\": \"" << *registration_id << '"';
|
||||
|
||||
@@ -211,6 +214,10 @@ Invalidation::matches(const Invalidation &other) const
|
||||
if (!other.object_type.ok() || *object_type != *other.object_type) return false;
|
||||
}
|
||||
|
||||
if (invalidation_type.ok()) {
|
||||
if (!other.invalidation_type.ok() || *invalidation_type != *other.invalidation_type) return false;
|
||||
}
|
||||
|
||||
if (source_id.ok()) {
|
||||
if (!other.source_id.ok() || *source_id != *other.source_id) return false;
|
||||
}
|
||||
|
@@ -513,7 +513,6 @@ private:
|
||||
{
|
||||
if (!isBioSocketReady()) return 0;
|
||||
|
||||
dbgTrace(D_MESSAGING) << "Sending request: " << printOut(request);
|
||||
size_t offset = request.length() - data_left_to_send;
|
||||
auto curr_data_to_send = request.c_str() + offset;
|
||||
int data_sent_len = BIO_write(bio.get(), curr_data_to_send, data_left_to_send);
|
||||
@@ -544,7 +543,6 @@ private:
|
||||
int receive_len = BIO_read(bio.get(), buffer, sizeof(buffer) - 1);
|
||||
|
||||
if (receive_len > 0) {
|
||||
dbgTrace(D_CONNECTION) << "Received " << receive_len << " bytes";
|
||||
return string(buffer, receive_len);
|
||||
}
|
||||
|
||||
|
@@ -54,7 +54,7 @@ public:
|
||||
bool force_buffering = true
|
||||
);
|
||||
|
||||
Maybe<HTTPStatusCode, HTTPResponse> downloadFile(
|
||||
Maybe<void, HTTPResponse> downloadFile(
|
||||
HTTPMethod method,
|
||||
const std::string &uri,
|
||||
const std::string &download_file_path,
|
||||
@@ -62,7 +62,7 @@ public:
|
||||
const MessageMetadata &message_metadata = MessageMetadata()
|
||||
);
|
||||
|
||||
Maybe<HTTPStatusCode, HTTPResponse> uploadFile(
|
||||
Maybe<void, HTTPResponse> uploadFile(
|
||||
const std::string &uri,
|
||||
const std::string &upload_file_path,
|
||||
MessageCategory category,
|
||||
|
@@ -62,7 +62,7 @@ public:
|
||||
return messaging_comp.sendAsyncMessage(method, uri, body, category, message_metadata, force_buffering);
|
||||
}
|
||||
|
||||
Maybe<HTTPStatusCode, HTTPResponse>
|
||||
Maybe<void, HTTPResponse>
|
||||
downloadFile(
|
||||
const HTTPMethod method,
|
||||
const std::string &uri,
|
||||
@@ -74,7 +74,7 @@ public:
|
||||
return messaging_comp.downloadFile(method, uri, download_file_path, category, message_metadata);
|
||||
}
|
||||
|
||||
Maybe<HTTPStatusCode, HTTPResponse>
|
||||
Maybe<void, HTTPResponse>
|
||||
uploadFile(
|
||||
const std::string &uri,
|
||||
const std::string &upload_file_path,
|
||||
|
@@ -61,7 +61,9 @@ HTTPRequest::setConnectionHeaders(const Connection &conn)
|
||||
}
|
||||
}
|
||||
|
||||
insertHeader("Host", host);
|
||||
if (headers.find("Host") == headers.end()) {
|
||||
insertHeader("Host", host);
|
||||
}
|
||||
insertHeader("Content-Length", to_string(body.size()));
|
||||
insertHeader("Content-type", "application/json");
|
||||
insertHeader("Accept-Encoding", "identity");
|
||||
@@ -82,10 +84,12 @@ HTTPRequest::prepareRequest(
|
||||
{
|
||||
HTTPRequest req(method, uri, headers, body);
|
||||
|
||||
if (!req.setConnectionHeaders(conn)) return genError("Failed to identify the HTTP method");
|
||||
|
||||
string agent_registration_query = R"("authenticationMethod": "token")";
|
||||
bool dont_add_access_token = false;
|
||||
if (headers.find("Host") != headers.end()) {
|
||||
dont_add_access_token = true;
|
||||
dbgTrace(D_MESSAGING) << "Request is not for FOG";
|
||||
}
|
||||
string agent_registration_query = R"("authenticationMethod": "token")";
|
||||
if (method == HTTPMethod::CONNECT || body.find(agent_registration_query) != string::npos) {
|
||||
dont_add_access_token = true;
|
||||
dbgTrace(D_MESSAGING) << "Request is for agent authentication";
|
||||
@@ -93,6 +97,8 @@ HTTPRequest::prepareRequest(
|
||||
auto res = req.addAccessToken(conn, dont_add_access_token);
|
||||
if (!res.ok()) return res.passErr();
|
||||
|
||||
if (!req.setConnectionHeaders(conn)) return genError("Failed to identify the HTTP method");
|
||||
|
||||
if (conn.isOverProxy()) {
|
||||
auto res = req.addProxyAuthorization(conn);
|
||||
if (!res.ok()) return res.passErr();
|
||||
|
@@ -145,7 +145,7 @@ MessagingComp::sendAsyncMessage(
|
||||
i_messaging_buffer->pushNewBufferedMessage(body, method, uri, category, new_message_metadata, false);
|
||||
}
|
||||
|
||||
Maybe<HTTPStatusCode, HTTPResponse>
|
||||
Maybe<void, HTTPResponse>
|
||||
MessagingComp::downloadFile(
|
||||
HTTPMethod method,
|
||||
const string &uri,
|
||||
@@ -166,7 +166,9 @@ MessagingComp::downloadFile(
|
||||
|
||||
auto response = sendSyncMessage(method, uri, "", category, message_metadata);
|
||||
if (!response.ok()) return response.passErr();
|
||||
|
||||
if (response.unpack().getHTTPStatusCode() != HTTPStatusCode::HTTP_OK) {
|
||||
return genError(HTTPResponse(response.unpack().getHTTPStatusCode(), response.unpack().getBody()));
|
||||
}
|
||||
ofstream file_stream(download_file_path);
|
||||
if (!file_stream.is_open()) {
|
||||
string open_err = "Failed to open the destination file. Path: " + download_file_path;
|
||||
@@ -177,10 +179,10 @@ MessagingComp::downloadFile(
|
||||
file_stream.close();
|
||||
|
||||
dbgTrace(D_MESSAGING) << "Successfully downloaded and save file to: " << download_file_path;
|
||||
return HTTPStatusCode::HTTP_OK;
|
||||
return Maybe<void, HTTPResponse>();
|
||||
}
|
||||
|
||||
Maybe<HTTPStatusCode, HTTPResponse>
|
||||
Maybe<void, HTTPResponse>
|
||||
MessagingComp::uploadFile(
|
||||
const string &uri,
|
||||
const string &upload_file_path,
|
||||
@@ -205,9 +207,12 @@ MessagingComp::uploadFile(
|
||||
sendSyncMessage(HTTPMethod::PUT, uri, buffer.str(), category, message_metadata);
|
||||
|
||||
if (!response.ok()) return response.passErr();
|
||||
if (response.unpack().getHTTPStatusCode() != HTTPStatusCode::HTTP_OK) {
|
||||
return genError(HTTPResponse(response.unpack().getHTTPStatusCode(), response.unpack().getBody()));
|
||||
}
|
||||
|
||||
dbgTrace(D_MESSAGING) << "Successfully upload file from: " << upload_file_path;
|
||||
return HTTPStatusCode::HTTP_OK;
|
||||
return Maybe<void, HTTPResponse>();
|
||||
}
|
||||
|
||||
bool
|
||||
|
@@ -183,7 +183,6 @@ TEST_F(TestMessagingComp, testUploadFile)
|
||||
EXPECT_CALL(mock_messaging_connection, mockSendRequest(_, _, _)).WillOnce(Return(res));
|
||||
auto upload_res = messaging_comp.uploadFile(uri, path, category, conn_metadata);
|
||||
ASSERT_TRUE(upload_res.ok());
|
||||
EXPECT_EQ(upload_res.unpack(), HTTPStatusCode::HTTP_OK);
|
||||
}
|
||||
|
||||
TEST_F(TestMessagingComp, testDownloadFile)
|
||||
@@ -207,7 +206,6 @@ TEST_F(TestMessagingComp, testDownloadFile)
|
||||
EXPECT_CALL(mock_messaging_connection, mockSendRequest(_, _, _)).WillOnce(Return(res));
|
||||
auto upload_res = messaging_comp.downloadFile(method, uri, "/tmp/test.txt", category, conn_metadata);
|
||||
ASSERT_TRUE(upload_res.ok());
|
||||
EXPECT_EQ(upload_res.unpack(), HTTPStatusCode::HTTP_OK);
|
||||
}
|
||||
|
||||
bool
|
||||
|
@@ -110,7 +110,8 @@ TagAndEnumManagement::convertStringToTag(const string &tag)
|
||||
{"apiDiscoveryCloudMessaging", ReportIS::Tags::API_DISCOVERY},
|
||||
{"Playground", ReportIS::Tags::PLAYGROUND},
|
||||
{"Nginx Proxy Manager", ReportIS::Tags::NGINX_PROXY_MANAGER},
|
||||
{"APISIX Server", ReportIS::Tags::WEB_SERVER_APISIX}
|
||||
{"APISIX Server", ReportIS::Tags::WEB_SERVER_APISIX},
|
||||
{"Docker Deployment", ReportIS::Tags::DEPLOYMENT_DOCKER}
|
||||
};
|
||||
|
||||
auto report_is_tag = strings_to_tags.find(tag);
|
||||
@@ -318,7 +319,8 @@ EnumArray<Tags, string> TagAndEnumManagement::tags_translation_arr {
|
||||
"Playground",
|
||||
"apiDiscoveryCloudMessaging",
|
||||
"Nginx Proxy Manager",
|
||||
"APISIX Server"
|
||||
"APISIX Server",
|
||||
"Docker Deployment"
|
||||
};
|
||||
|
||||
EnumArray<AudienceTeam, string> TagAndEnumManagement::audience_team_translation {
|
||||
|
Reference in New Issue
Block a user