summaryrefslogtreecommitdiffstats
path: root/third_party/content_analysis_sdk/demo
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--third_party/content_analysis_sdk/demo/agent.cc7
-rw-r--r--third_party/content_analysis_sdk/demo/client.cc2
-rw-r--r--third_party/content_analysis_sdk/demo/handler.h208
-rw-r--r--third_party/content_analysis_sdk/demo/handler_misbehaving.h257
4 files changed, 168 insertions, 306 deletions
diff --git a/third_party/content_analysis_sdk/demo/agent.cc b/third_party/content_analysis_sdk/demo/agent.cc
index c3640018e6..3e168b0915 100644
--- a/third_party/content_analysis_sdk/demo/agent.cc
+++ b/third_party/content_analysis_sdk/demo/agent.cc
@@ -136,12 +136,12 @@ void PrintHelp() {
<< kArgQueued << " : Queue requests for processing in a background thread" << std::endl
<< kArgThreads << " : When queued, number of threads in the request processing thread pool" << std::endl
<< kArgUserSpecific << " : Make agent OS user specific." << std::endl
+ << kArgHelp << " : prints this help message" << std::endl
<< kArgSavePrintRequestDataTo << " : saves the PDF data to the given file path for print requests" << std::endl
<< kArgToBlock << "<regex> : Regular expression matching file and text content to block." << std::endl
<< kArgToWarn << "<regex> : Regular expression matching file and text content to warn about." << std::endl
<< kArgToReport << "<regex> : Regular expression matching file and text content to report." << std::endl
- << kArgMisbehave << "<mode> : Use 'misbehaving' agent in given mode for testing purposes." << std::endl
- << kArgHelp << " : prints this help message" << std::endl;
+ << kArgMisbehave << "<mode> : Use 'misbehaving' agent in given mode for testing purposes." << std::endl;
}
int main(int argc, char* argv[]) {
@@ -150,10 +150,9 @@ int main(int argc, char* argv[]) {
return 1;
}
- // TODO: Add toBlock, toWarn, toReport to QueueingHandler
auto handler =
useMisbehavingHandler
- ? MisbehavingHandler::Create(delays[0], modeStr)
+ ? MisbehavingHandler::Create(modeStr, std::move(delays), save_print_data_path, std::move(toBlock), std::move(toWarn), std::move(toReport))
: use_queue
? std::make_unique<QueuingHandler>(num_threads, std::move(delays), save_print_data_path, std::move(toBlock), std::move(toWarn), std::move(toReport))
: std::make_unique<Handler>(std::move(delays), save_print_data_path, std::move(toBlock), std::move(toWarn), std::move(toReport));
diff --git a/third_party/content_analysis_sdk/demo/client.cc b/third_party/content_analysis_sdk/demo/client.cc
index 5e47fca57f..84ca6e2356 100644
--- a/third_party/content_analysis_sdk/demo/client.cc
+++ b/third_party/content_analysis_sdk/demo/client.cc
@@ -317,7 +317,7 @@ void HandleRequest(const ContentAnalysisRequest& request) {
global_final_action = final_action;
} else {
int err = client->Acknowledge(
- BuildAcknowledgement(request.request_token(), final_action));
+ BuildAcknowledgement(response.request_token(), final_action));
if (err != 0) {
aout.stream() << "[Demo] Error sending ack " << request.request_token()
<< std::endl;
diff --git a/third_party/content_analysis_sdk/demo/handler.h b/third_party/content_analysis_sdk/demo/handler.h
index 1c9871bd08..88599963c5 100644
--- a/third_party/content_analysis_sdk/demo/handler.h
+++ b/third_party/content_analysis_sdk/demo/handler.h
@@ -10,6 +10,7 @@
#include <algorithm>
#include <atomic>
#include <chrono>
+#include <cstdio>
#include <fstream>
#include <iostream>
#include <optional>
@@ -41,34 +42,46 @@ class Handler : public content_analysis::sdk::AgentEventHandler {
size_t nextDelayIndex() const { return nextDelayIndex_; }
protected:
+ // subclasses can override this
+ // returns whether the response has been set
+ virtual bool SetCustomResponse(AtomicCout& aout, std::unique_ptr<Event>& event) {
+ return false;
+ }
+ // subclasses can override this
+ // returns whether the response has been sent
+ virtual bool SendCustomResponse(std::unique_ptr<Event>& event) {
+ return false;
+ }
// Analyzes one request from Google Chrome and responds back to the browser
// with either an allow or block verdict.
- void AnalyzeContent(std::stringstream& stream, std::unique_ptr<Event> event) {
+ void AnalyzeContent(AtomicCout& aout, 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().
- DumpEvent(stream, event.get());
+ DumpEvent(aout.stream(), event.get());
bool success = true;
- std::optional<content_analysis::sdk::ContentAnalysisResponse_Result_TriggeredRule_Action> caResponse =
- content_analysis::sdk::ContentAnalysisResponse_Result_TriggeredRule_Action_BLOCK;
-
- if (event->GetRequest().has_text_content()) {
- caResponse = DecideCAResponse(
- event->GetRequest().text_content(), stream);
- } else if (event->GetRequest().has_file_path()) {
- // TODO: Fix downloads to store file *first* so we can check contents.
- // Until then, just check the file name:
- caResponse = DecideCAResponse(
- event->GetRequest().file_path(), stream);
- } else if (event->GetRequest().has_print_data()) {
- // In the case of print request, normally the PDF bytes would be parsed
- // for sensitive data violations. To keep this class simple, only the
- // URL is checked for the word "block".
- caResponse = DecideCAResponse(event->GetRequest().request_data().url(), stream);
+ std::optional<content_analysis::sdk::ContentAnalysisResponse_Result_TriggeredRule_Action> caResponse;
+ bool setResponse = SetCustomResponse(aout, event);
+ if (!setResponse) {
+ caResponse = content_analysis::sdk::ContentAnalysisResponse_Result_TriggeredRule_Action_BLOCK;
+ if (event->GetRequest().has_text_content()) {
+ caResponse = DecideCAResponse(
+ event->GetRequest().text_content(), aout.stream());
+ } else if (event->GetRequest().has_file_path()) {
+ // TODO: Fix downloads to store file *first* so we can check contents.
+ // Until then, just check the file name:
+ caResponse = DecideCAResponse(
+ event->GetRequest().file_path(), aout.stream());
+ } else if (event->GetRequest().has_print_data()) {
+ // In the case of print request, normally the PDF bytes would be parsed
+ // for sensitive data violations. To keep this class simple, only the
+ // URL is checked for the word "block".
+ caResponse = DecideCAResponse(event->GetRequest().request_data().url(), aout.stream());
+ }
}
if (!success) {
@@ -76,61 +89,67 @@ class Handler : public content_analysis::sdk::AgentEventHandler {
event->GetResponse(),
std::string(),
content_analysis::sdk::ContentAnalysisResponse::Result::FAILURE);
- stream << " Verdict: failed to reach verdict: ";
- stream << event->DebugString() << std::endl;
+ aout.stream() << " Verdict: failed to reach verdict: ";
+ aout.stream() << event->DebugString() << std::endl;
} else {
- stream << " Verdict: ";
+ aout.stream() << " Verdict: ";
if (caResponse) {
switch (caResponse.value()) {
case content_analysis::sdk::ContentAnalysisResponse_Result_TriggeredRule_Action_BLOCK:
- stream << "BLOCK";
+ aout.stream() << "BLOCK";
break;
case content_analysis::sdk::ContentAnalysisResponse_Result_TriggeredRule_Action_WARN:
- stream << "WARN";
+ aout.stream() << "WARN";
break;
case content_analysis::sdk::ContentAnalysisResponse_Result_TriggeredRule_Action_REPORT_ONLY:
- stream << "REPORT_ONLY";
+ aout.stream() << "REPORT_ONLY";
break;
case content_analysis::sdk::ContentAnalysisResponse_Result_TriggeredRule_Action_ACTION_UNSPECIFIED:
- stream << "ACTION_UNSPECIFIED";
+ aout.stream() << "ACTION_UNSPECIFIED";
break;
default:
- stream << "<error>";
+ aout.stream() << "<error>";
break;
}
auto rc =
content_analysis::sdk::SetEventVerdictTo(event.get(), caResponse.value());
if (rc != content_analysis::sdk::ResultCode::OK) {
- stream << " error: "
- << content_analysis::sdk::ResultCodeToString(rc) << std::endl;
- stream << " " << event->DebugString() << std::endl;
+ aout.stream() << " error: "
+ << content_analysis::sdk::ResultCodeToString(rc) << std::endl;
+ aout.stream() << " " << event->DebugString() << std::endl;
}
- stream << std::endl;
+ aout.stream() << std::endl;
} else {
- stream << " Verdict: allow" << std::endl;
+ aout.stream() << " Verdict: allow" << std::endl;
}
- stream << std::endl;
+ aout.stream() << std::endl;
}
- stream << std::endl;
+ aout.stream() << std::endl;
// If a delay is specified, wait that much.
size_t nextDelayIndex = nextDelayIndex_.fetch_add(1);
unsigned long delay = delays_[nextDelayIndex % delays_.size()];
if (delay > 0) {
+ aout.stream() << "Delaying response to " << event->GetRequest().request_token()
+ << " for " << delay << "s" << std::endl<< std::endl;
+ aout.flush();
std::this_thread::sleep_for(std::chrono::seconds(delay));
}
// Send the response back to Google Chrome.
- auto rc = event->Send();
- if (rc != content_analysis::sdk::ResultCode::OK) {
- stream << "[Demo] Error sending response: "
- << content_analysis::sdk::ResultCodeToString(rc)
- << std::endl;
- stream << event->DebugString() << std::endl;
+ bool sentCustomResponse = SendCustomResponse(event);
+ if (!sentCustomResponse) {
+ auto rc = event->Send();
+ if (rc != content_analysis::sdk::ResultCode::OK) {
+ aout.stream() << "[Demo] Error sending response: "
+ << content_analysis::sdk::ResultCodeToString(rc)
+ << std::endl;
+ aout.stream() << event->DebugString() << std::endl;
+ }
}
}
- private:
+ protected:
void OnBrowserConnected(
const content_analysis::sdk::BrowserInfo& info) override {
AtomicCout aout;
@@ -155,7 +174,7 @@ class Handler : public content_analysis::sdk::AgentEventHandler {
// In this example code, the event is handled synchronously.
AtomicCout aout;
aout.stream() << std::endl << "----------" << std::endl << std::endl;
- AnalyzeContent(aout.stream(), std::move(event));
+ AnalyzeContent(aout, std::move(event));
}
void OnResponseAcknowledged(
@@ -183,7 +202,7 @@ class Handler : public content_analysis::sdk::AgentEventHandler {
}
AtomicCout aout;
- aout.stream() << "Ack: " << ack.request_token() << std::endl;
+ aout.stream() << " Ack: " << ack.request_token() << std::endl;
aout.stream() << " Final action: " << final_action << std::endl;
}
void OnCancelRequests(
@@ -206,31 +225,62 @@ class Handler : public content_analysis::sdk::AgentEventHandler {
void DumpEvent(std::stringstream& stream, Event* event) {
time_t now = time(nullptr);
- stream << "Received at: " << ctime(&now); // Returned string includes \n.
+ stream << "Received at: " << ctime(&now); // Includes \n.
+ stream << "Received from: pid=" << event->GetBrowserInfo().pid
+ << " path=" << event->GetBrowserInfo().binary_path << std::endl;
const content_analysis::sdk::ContentAnalysisRequest& request =
event->GetRequest();
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;
+ 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;
+ }
+ }
+ std::string reason;
+ if (request.has_reason()) {
+ using content_analysis::sdk::ContentAnalysisRequest;
+ switch (request.reason()) {
+ case content_analysis::sdk::ContentAnalysisRequest::UNKNOWN:
+ reason = "<Unknown>";
+ break;
+ case content_analysis::sdk::ContentAnalysisRequest::CLIPBOARD_PASTE:
+ reason = "CLIPBOARD_PASTE";
+ break;
+ case content_analysis::sdk::ContentAnalysisRequest::DRAG_AND_DROP:
+ reason = "DRAG_AND_DROP";
+ break;
+ case content_analysis::sdk::ContentAnalysisRequest::FILE_PICKER_DIALOG:
+ reason = "FILE_PICKER_DIALOG";
+ break;
+ case content_analysis::sdk::ContentAnalysisRequest::PRINT_PREVIEW_PRINT:
+ reason = "PRINT_PREVIEW_PRINT";
+ break;
+ case content_analysis::sdk::ContentAnalysisRequest::SYSTEM_DIALOG_PRINT:
+ reason = "SYSTEM_DIALOG_PRINT";
+ break;
+ case content_analysis::sdk::ContentAnalysisRequest::NORMAL_DOWNLOAD:
+ reason = "NORMAL_DOWNLOAD";
+ break;
+ case content_analysis::sdk::ContentAnalysisRequest::SAVE_AS_DOWNLOAD:
+ reason = "SAVE_AS_DOWNLOAD";
+ break;
}
}
@@ -252,11 +302,7 @@ class Handler : public content_analysis::sdk::AgentEventHandler {
std::string file_path =
request.has_file_path()
- ? request.file_path() : "<none>";
-
- std::string text_content =
- request.has_text_content()
- ? request.text_content() : "<none>";
+ ? request.file_path() : "None, bulk text entry or print";
std::string machine_user =
request.has_client_metadata() &&
@@ -282,14 +328,35 @@ class Handler : public content_analysis::sdk::AgentEventHandler {
stream << " Expires at: " << expires_at_str << " ("
<< secs_remaining << " seconds from now)" << std::endl;
stream << " Connector: " << connector << std::endl;
+ if (!reason.empty()) {
+ stream << " Reason: " << reason << std::endl;
+ }
stream << " URL: " << url << std::endl;
stream << " Tab title: " << tab_title << std::endl;
stream << " Filename: " << filename << std::endl;
stream << " Digest: " << digest << std::endl;
stream << " Filepath: " << file_path << std::endl;
- stream << " Text content: '" << text_content << "'" << std::endl;
stream << " Machine user: " << machine_user << std::endl;
stream << " Email: " << email << std::endl;
+
+ if (request.has_text_content() && !request.text_content().empty()) {
+ std::string prefix = " Pasted data: ";
+ std::string text_content = request.text_content();
+
+ // Truncate the text past 50 bytes to keep it to a reasonable length in
+ // the terminal window.
+ if (text_content.size() > 50) {
+ prefix = " Pasted data (truncated): ";
+ text_content = text_content.substr(0, 50) + "...";
+ }
+ stream << prefix
+ << text_content
+ << std::endl;
+ stream << " Pasted data size (bytes): "
+ << request.text_content().size()
+ << std::endl;
+ }
+
if (request.has_print_data() && !print_data_file_path_.empty()) {
if (request.request_data().has_print_metadata() &&
request.request_data().print_metadata().has_printer_name()) {
@@ -415,12 +482,13 @@ class QueuingHandler : public Handler {
AtomicCout aout;
aout.stream() << std::endl << "----------" << std::endl;
- aout.stream() << "Thread: " << std::this_thread::get_id() << std::endl;
+ aout.stream() << "Thread: " << std::this_thread::get_id()
+ << std::endl;
aout.stream() << "Delaying request processing for "
<< handler->delays()[handler->nextDelayIndex() % handler->delays().size()] << "s" << std::endl << std::endl;
aout.flush();
- handler->AnalyzeContent(aout.stream(), std::move(event));
+ handler->AnalyzeContent(aout, std::move(event));
}
return 0;
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_;
};