summaryrefslogtreecommitdiffstats
path: root/third_party/content_analysis_sdk/demo/handler_misbehaving.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--third_party/content_analysis_sdk/demo/handler_misbehaving.h257
1 files changed, 26 insertions, 231 deletions
diff --git a/third_party/content_analysis_sdk/demo/handler_misbehaving.h b/third_party/content_analysis_sdk/demo/handler_misbehaving.h
index d303049d98..bb0b4f18ad 100644
--- a/third_party/content_analysis_sdk/demo/handler_misbehaving.h
+++ b/third_party/content_analysis_sdk/demo/handler_misbehaving.h
@@ -20,6 +20,7 @@
#include "content_analysis/sdk/analysis.pb.h"
#include "content_analysis/sdk/analysis_agent.h"
#include "agent/src/event_win.h"
+#include "handler.h"
enum class Mode {
// Have to use a "Mode_" prefix to avoid preprocessing problems in StringToMode
@@ -93,13 +94,18 @@ static DWORD WriteBigMessageToPipe(HANDLE pipe, const std::string& message) {
}
// An AgentEventHandler that does various misbehaving things
-class MisbehavingHandler final : public content_analysis::sdk::AgentEventHandler {
+class MisbehavingHandler final : public Handler {
public:
using Event = content_analysis::sdk::ContentAnalysisEvent;
static
- std::unique_ptr<AgentEventHandler> Create(unsigned long delay,
- const std::string& modeStr) {
+ std::unique_ptr<AgentEventHandler> Create(
+ const std::string& modeStr,
+ std::vector<unsigned long>&& delays,
+ const std::string& print_data_file_path,
+ RegexArray&& toBlock = RegexArray(),
+ RegexArray&& toWarn = RegexArray(),
+ RegexArray&& toReport = RegexArray()) {
auto it = sStringToMode.find(modeStr);
if (it == sStringToMode.end()) {
std::cout << "\"" << modeStr << "\""
@@ -107,11 +113,17 @@ class MisbehavingHandler final : public content_analysis::sdk::AgentEventHandler
return nullptr;
}
- return std::unique_ptr<AgentEventHandler>(new MisbehavingHandler(delay, it->second));
+ return std::unique_ptr<AgentEventHandler>(new MisbehavingHandler(it->second, std::move(delays), print_data_file_path, std::move(toBlock), std::move(toWarn), std::move(toReport)));
}
private:
- MisbehavingHandler(unsigned long delay, Mode mode) : delay_(delay), mode_(mode) {}
+ MisbehavingHandler(Mode mode, std::vector<unsigned long>&& delays, const std::string& print_data_file_path,
+ RegexArray&& toBlock = RegexArray(),
+ RegexArray&& toWarn = RegexArray(),
+ RegexArray&& toReport = RegexArray()) :
+ Handler(std::move(delays), print_data_file_path, std::move(toBlock), std::move(toWarn), std::move(toReport)),
+ mode_(mode) {}
+
template <size_t N>
DWORD SendBytesOverPipe(const unsigned char (&bytes)[N],
@@ -124,20 +136,11 @@ class MisbehavingHandler final : public content_analysis::sdk::AgentEventHandler
return WriteBigMessageToPipe(pipe, s);
}
- // Analyzes one request from Google Chrome and responds back to the browser
- // with either an allow or block verdict.
- void AnalyzeContent(std::unique_ptr<Event> event) {
- // An event represents one content analysis request and response triggered
- // by a user action in Google Chrome. The agent determines whether the
- // user is allowed to perform the action by examining event->GetRequest().
- // The verdict, which can be "allow" or "block" is written into
- // event->GetResponse().
-
+ bool SetCustomResponse(AtomicCout& aout, std::unique_ptr<Event>& event) override {
std::cout << std::endl << "----------" << std::endl << std::endl;
-
- DumpRequest(event->GetRequest());
std::cout << "Mode is " << sModeToString[mode_] << std::endl;
+ bool handled = true;
if (mode_ == Mode::Mode_largeResponse) {
for (size_t i = 0; i < 1000; ++i) {
content_analysis::sdk::ContentAnalysisResponse_Result* result =
@@ -177,7 +180,7 @@ class MisbehavingHandler final : public content_analysis::sdk::AgentEventHandler
event->GetResponse().clear_results();
} else if (mode_ == Mode::Mode_resultWithInvalidStatus) {
// This causes an assertion failure and the process exits
- // So we just serialize this ourselves below
+ // So we just serialize this ourselves in SendCustomResponse()
/*content_analysis::sdk::ContentAnalysisResponse_Result* result =
event->GetResponse().mutable_results(0);
result->set_status(
@@ -185,38 +188,12 @@ class MisbehavingHandler final : public content_analysis::sdk::AgentEventHandler
::content_analysis::sdk::ContentAnalysisResponse_Result_Status>(
100));*/
} else {
- bool block = false;
-
- if (event->GetRequest().has_text_content()) {
- block = ShouldBlockRequest(event->GetRequest().text_content());
- } else if (event->GetRequest().has_file_path()) {
- block = ShouldBlockRequest(event->GetRequest().file_path());
- }
-
- if (block) {
- auto rc = content_analysis::sdk::SetEventVerdictToBlock(event.get());
- std::cout << " Verdict: block";
- if (rc != content_analysis::sdk::ResultCode::OK) {
- std::cout << " error: "
- << content_analysis::sdk::ResultCodeToString(rc)
- << std::endl;
- std::cout << " " << event->DebugString() << std::endl;
- }
- std::cout << std::endl;
- } else {
- std::cout << " Verdict: allow" << std::endl;
- }
- }
-
- std::cout << std::endl;
-
- // If a delay is specified, wait that much.
- if (delay_ > 0) {
- std::cout << "[Demo] delaying request processing for " << delay_ << "s"
- << std::endl;
- std::this_thread::sleep_for(std::chrono::seconds(delay_));
+ handled = false;
}
+ return handled;
+ }
+ bool SendCustomResponse(std::unique_ptr<Event>& event) override {
if (mode_ == Mode::Mode_largeResponse) {
content_analysis::sdk::ContentAnalysisEventWin* eventWin =
static_cast<content_analysis::sdk::ContentAnalysisEventWin*>(
@@ -301,194 +278,12 @@ class MisbehavingHandler final : public content_analysis::sdk::AgentEventHandler
// bit, indicating there should be a byte after this
SendBytesOverPipe(bytes, event);
} else {
- std::cout << "(misbehaving) Handler::AnalyzeContent() about to call "
- "event->Send(), mode is "
- << sModeToString[mode_] << std::endl;
- // Send the response back to Google Chrome.
- auto rc = event->Send();
- if (rc != content_analysis::sdk::ResultCode::OK) {
- std::cout << "[Demo] Error sending response: "
- << content_analysis::sdk::ResultCodeToString(rc) << std::endl;
- std::cout << event->DebugString() << std::endl;
- }
- }
- }
-
- private:
- void OnBrowserConnected(
- const content_analysis::sdk::BrowserInfo& info) override {
- std::cout << std::endl << "==========" << std::endl;
- std::cout << "Browser connected pid=" << info.pid << std::endl;
- }
-
- void OnBrowserDisconnected(
- const content_analysis::sdk::BrowserInfo& info) override {
- std::cout << std::endl
- << "Browser disconnected pid=" << info.pid << std::endl;
- std::cout << "==========" << std::endl;
- }
-
- void OnAnalysisRequested(std::unique_ptr<Event> event) override {
- // If the agent is capable of analyzing content in the background, the
- // events may be handled in background threads. Having said that, a
- // event should not be assumed to be thread safe, that is, it should not
- // be accessed by more than one thread concurrently.
- //
- // In this example code, the event is handled synchronously.
- AnalyzeContent(std::move(event));
- }
- void OnResponseAcknowledged(
- const content_analysis::sdk::ContentAnalysisAcknowledgement& ack)
- override {
- const char* final_action = "<Unknown>";
- if (ack.has_final_action()) {
- switch (ack.final_action()) {
- case content_analysis::sdk::ContentAnalysisAcknowledgement::
- ACTION_UNSPECIFIED:
- final_action = "<Unspecified>";
- break;
- case content_analysis::sdk::ContentAnalysisAcknowledgement::ALLOW:
- final_action = "Allow";
- break;
- case content_analysis::sdk::ContentAnalysisAcknowledgement::REPORT_ONLY:
- final_action = "Report only";
- break;
- case content_analysis::sdk::ContentAnalysisAcknowledgement::WARN:
- final_action = "Warn";
- break;
- case content_analysis::sdk::ContentAnalysisAcknowledgement::BLOCK:
- final_action = "Block";
- break;
- }
- }
-
- std::cout << "Ack: " << ack.request_token() << std::endl;
- std::cout << " Final action: " << final_action << std::endl;
- }
- void OnCancelRequests(
- const content_analysis::sdk::ContentAnalysisCancelRequests& cancel)
- override {
- std::cout << "Cancel: " << std::endl;
- std::cout << " User action ID: " << cancel.user_action_id() << std::endl;
- }
-
- void OnInternalError(const char* context,
- content_analysis::sdk::ResultCode error) override {
- std::cout << std::endl
- << "*ERROR*: context=\"" << context << "\" "
- << content_analysis::sdk::ResultCodeToString(error) << std::endl;
- }
-
- void DumpRequest(
- const content_analysis::sdk::ContentAnalysisRequest& request) {
- std::string connector = "<Unknown>";
- if (request.has_analysis_connector()) {
- switch (request.analysis_connector()) {
- case content_analysis::sdk::FILE_DOWNLOADED:
- connector = "download";
- break;
- case content_analysis::sdk::FILE_ATTACHED:
- connector = "attach";
- break;
- case content_analysis::sdk::BULK_DATA_ENTRY:
- connector = "bulk-data-entry";
- break;
- case content_analysis::sdk::PRINT:
- connector = "print";
- break;
- case content_analysis::sdk::FILE_TRANSFER:
- connector = "file-transfer";
- break;
- default:
- break;
- }
+ return false;
}
-
- std::string url =
- request.has_request_data() && request.request_data().has_url()
- ? request.request_data().url()
- : "<No URL>";
-
- std::string tab_title =
- request.has_request_data() && request.request_data().has_tab_title()
- ? request.request_data().tab_title()
- : "<No tab title>";
-
- std::string filename =
- request.has_request_data() && request.request_data().has_filename()
- ? request.request_data().filename()
- : "<No filename>";
-
- std::string digest =
- request.has_request_data() && request.request_data().has_digest()
- ? request.request_data().digest()
- : "<No digest>";
-
- std::string file_path =
- request.has_file_path() ? request.file_path() : "<none>";
-
- std::string text_content =
- request.has_text_content() ? request.text_content() : "<none>";
-
- std::string machine_user =
- request.has_client_metadata() &&
- request.client_metadata().has_browser() &&
- request.client_metadata().browser().has_machine_user()
- ? request.client_metadata().browser().machine_user()
- : "<No machine user>";
-
- std::string email =
- request.has_request_data() && request.request_data().has_email()
- ? request.request_data().email()
- : "<No email>";
-
- time_t t = request.expires_at();
-
- std::string user_action_id = request.has_user_action_id()
- ? request.user_action_id()
- : "<No user action id>";
-
- std::cout << "Request: " << request.request_token() << std::endl;
- std::cout << " User action ID: " << user_action_id << std::endl;
- std::cout << " Expires at: " << ctime(&t); // Returned string includes \n.
- std::cout << " Connector: " << connector << std::endl;
- std::cout << " URL: " << url << std::endl;
- std::cout << " Tab title: " << tab_title << std::endl;
- std::cout << " Filename: " << filename << std::endl;
- std::cout << " Digest: " << digest << std::endl;
- std::cout << " Filepath: " << file_path << std::endl;
- std::cout << " Text content: '" << text_content << "'" << std::endl;
- std::cout << " Machine user: " << machine_user << std::endl;
- std::cout << " Email: " << email << std::endl;
- }
-
- bool ReadContentFromFile(const std::string& file_path, std::string* content) {
- std::ifstream file(file_path,
- std::ios::in | std::ios::binary | std::ios::ate);
- if (!file.is_open()) return false;
-
- // Get file size. This example does not handle files larger than 1MB.
- // Make sure content string can hold the contents of the file.
- int size = file.tellg();
- if (size > 1024 * 1024) return false;
-
- content->resize(size + 1);
-
- // Read file into string.
- file.seekg(0, std::ios::beg);
- file.read(&(*content)[0], size);
- content->at(size) = 0;
return true;
}
- bool ShouldBlockRequest(const std::string& content) {
- // Determines if the request should be blocked. (not needed for the
- // misbehaving agent)
- std::cout << "'" << content << "' was not blocked\n";
- return false;
- }
-
- unsigned long delay_;
+ private:
Mode mode_;
};