Reenable basic deceptive link highlighting.
* bindings/vapi/javascriptcore-4.0.vapi (Object::get_property): Fix return type. * src/client/conversation-viewer/conversation-message.vala (GtkTemplate): Hook up to new deceptive_link_clicked signal, remove old DOM-based implementation. * src/client/conversation-viewer/conversation-web-view.vala (ConversationWebView): Add new deceptive_link_clicked signal and DeceptiveText enum, listen for deceptiveLinkClicked JS message and fire signal when received. * src/client/util/util-webkit.vala (WebKitUtil): Add to_object util function. * src/engine/util/util-js.vala (Geary.JS): Add to_object and get_property util functions. * ui/conversation-web-view.js (ConversationPageState) Listen for link clicks, check for deceptive text and send message if found. Add unit tests for deceptive text check. * test/js/composer-page-state-test.vala: Move ::run_javascript to parent class so new ConversationPageStateTest class can use it, adapt call sites to different parent signature.
This commit is contained in:
parent
69da046ff3
commit
2b5f94da7d
11 changed files with 371 additions and 140 deletions
93
test/js/conversation-page-state-test.vala
Normal file
93
test/js/conversation-page-state-test.vala
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
* Copyright 2017 Michael Gratton <mike@vee.net>
|
||||
*
|
||||
* This software is licensed under the GNU Lesser General Public License
|
||||
* (version 2.1 or later). See the COPYING file in this distribution.
|
||||
*/
|
||||
|
||||
class ConversationPageStateTest : ClientWebViewTestCase<ConversationWebView> {
|
||||
|
||||
public ConversationPageStateTest() {
|
||||
base("ConversationPageStateTest");
|
||||
add_test("is_deceptive_text_not_url", is_deceptive_text_not_url);
|
||||
add_test("is_deceptive_text_identical_text", is_deceptive_text_identical_text);
|
||||
add_test("is_deceptive_text_matching_url", is_deceptive_text_matching_url);
|
||||
add_test("is_deceptive_text_common_href_subdomain", is_deceptive_text_common_href_subdomain);
|
||||
add_test("is_deceptive_text_common_text_subdomain", is_deceptive_text_common_text_subdomain);
|
||||
add_test("is_deceptive_text_deceptive_href", is_deceptive_text_deceptive_href);
|
||||
add_test("is_deceptive_text_non_matching_subdomain", is_deceptive_text_non_matching_subdomain);
|
||||
add_test("is_deceptive_text_different_domain", is_deceptive_text_different_domain);
|
||||
}
|
||||
|
||||
public void is_deceptive_text_not_url() {
|
||||
load_body_fixture("<p>my hovercraft is full of eels</p>");
|
||||
assert(exec_is_deceptive_text("ohhai!", "http://example.com") ==
|
||||
ConversationWebView.DeceptiveText.NOT_DECEPTIVE);
|
||||
}
|
||||
|
||||
public void is_deceptive_text_identical_text() {
|
||||
load_body_fixture("<p>my hovercraft is full of eels</p>");
|
||||
assert(exec_is_deceptive_text("http://example.com", "http://example.com") ==
|
||||
ConversationWebView.DeceptiveText.NOT_DECEPTIVE);
|
||||
}
|
||||
|
||||
public void is_deceptive_text_matching_url() {
|
||||
load_body_fixture("<p>my hovercraft is full of eels</p>");
|
||||
assert(exec_is_deceptive_text("example.com", "http://example.com") ==
|
||||
ConversationWebView.DeceptiveText.NOT_DECEPTIVE);
|
||||
}
|
||||
|
||||
public void is_deceptive_text_common_href_subdomain() {
|
||||
load_body_fixture("<p>my hovercraft is full of eels</p>");
|
||||
assert(exec_is_deceptive_text("example.com", "http://foo.example.com") ==
|
||||
ConversationWebView.DeceptiveText.NOT_DECEPTIVE);
|
||||
}
|
||||
|
||||
public void is_deceptive_text_common_text_subdomain() {
|
||||
load_body_fixture("<p>my hovercraft is full of eels</p>");
|
||||
assert(exec_is_deceptive_text("www.example.com", "http://example.com") ==
|
||||
ConversationWebView.DeceptiveText.NOT_DECEPTIVE);
|
||||
}
|
||||
|
||||
public void is_deceptive_text_deceptive_href() {
|
||||
load_body_fixture("<p>my hovercraft is full of eels</p>");
|
||||
assert(exec_is_deceptive_text("www.example.com", "ohhai!") ==
|
||||
ConversationWebView.DeceptiveText.DECEPTIVE_HREF);
|
||||
}
|
||||
|
||||
public void is_deceptive_text_non_matching_subdomain() {
|
||||
load_body_fixture("<p>my hovercraft is full of eels</p>");
|
||||
assert(exec_is_deceptive_text("www.example.com", "phishing.com") ==
|
||||
ConversationWebView.DeceptiveText.DECEPTIVE_DOMAIN);
|
||||
}
|
||||
|
||||
public void is_deceptive_text_different_domain() {
|
||||
load_body_fixture("<p>my hovercraft is full of eels</p>");
|
||||
assert(exec_is_deceptive_text("www.example.com", "phishing.net") ==
|
||||
ConversationWebView.DeceptiveText.DECEPTIVE_DOMAIN);
|
||||
}
|
||||
|
||||
protected override ConversationWebView set_up_test_view() {
|
||||
try {
|
||||
ConversationWebView.load_resources(File.new_for_path(""));
|
||||
} catch (Error err) {
|
||||
assert_not_reached();
|
||||
}
|
||||
return new ConversationWebView(this.config);
|
||||
}
|
||||
|
||||
private uint exec_is_deceptive_text(string text, string href) {
|
||||
try {
|
||||
return (uint) WebKitUtil.to_number(
|
||||
run_javascript(@"ConversationPageState.isDeceptiveText(\"$text\", \"$href\")")
|
||||
);
|
||||
} catch (Geary.JS.Error err) {
|
||||
print("Geary.JS.Error: %s\n", err.message);
|
||||
assert_not_reached();
|
||||
} catch (Error err) {
|
||||
print("WKError: %s\n", err.message);
|
||||
assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue