Skip to content

Commit

Permalink
Merge pull request #2 from w-shackleton/html
Browse files Browse the repository at this point in the history
HTML manipulation features
  • Loading branch information
w-shackleton committed May 12, 2014
2 parents 09bf4b1 + 9a33d95 commit b4e9c63
Show file tree
Hide file tree
Showing 9 changed files with 216 additions and 27 deletions.
18 changes: 18 additions & 0 deletions res/raw/js_removewords
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
allTextNodes = $("body *").contents().filter(function() {
return this.nodeType == 3;
});

var changeText = function() {
var node = allTextNodes[Math.floor(Math.random() * allTextNodes.length)];
var words = node.nodeValue.split(" ");
words.splice(Math.floor(Math.random() * words.length),1);
node.nodeValue = words.join(" ");
setTimeout(changeText, "400");
};
setTimeout(changeText, "2000");
});
</script>
9 changes: 9 additions & 0 deletions res/values/spoofs.xml
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,13 @@
<string name="spoof_title_reverse">Reverse title</string>
<string name="spoof_title_reverse_description">Reverse all website titles</string>

<string name="spoof_content_flip">Flip content</string>
<string name="spoof_content_flip_description">Turn the content of all websites upside down</string>
<string name="spoof_gravity">Websites experience gravity</string>
<string name="spoof_gravity_description">All elements on websites fall to the bottom of the page</string>
<string name="spoof_delete">Delete random words</string>
<string name="spoof_delete_description">Words disappear from pages every second</string>

<string name="spoof_textchange">Change text</string>
<string name="spoof_textchange_description">Replace words with others</string>
</resources>
13 changes: 8 additions & 5 deletions src/uk/digitalsquid/netspoofer/config/IOHelpers.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

Expand All @@ -40,12 +41,14 @@ private IOHelpers() {}
* @throws IOException
*/
public static final String readFileContents(InputStream is) throws IOException {
StringBuffer out = new StringBuffer();
byte[] b = new byte[256];
for (int n; (n = is.read(b)) != -1;) {
out.append(new String(b, 0, n));
StringWriter out = new StringWriter();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while((line = reader.readLine()) != null) {
out.append(line);
out.append('\n');
}
is.close();
reader.close();
return out.toString();
}

Expand Down
11 changes: 11 additions & 0 deletions src/uk/digitalsquid/netspoofer/config/Lists.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
package uk.digitalsquid.netspoofer.config;

import java.util.ArrayList;
import java.util.Map;

public final class Lists {
private Lists() {}
Expand All @@ -31,4 +32,14 @@ public static final <T> ArrayList<T> singleton(T x) {
result.add(x);
return result;
}

public static final String map(Map<Character, Character> map, String in) {
StringBuilder result = new StringBuilder(in.length());
for(char c : in.toCharArray()) {
Character ud = map.get(c);
if(ud == null) ud = c;
result.append(ud);
}
return result.toString();
}
}
8 changes: 8 additions & 0 deletions src/uk/digitalsquid/netspoofer/config/RunManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@
import java.util.Map;

import uk.digitalsquid.netspoofer.proxy.NSProxy;
import uk.digitalsquid.netspoofer.spoofs.ContentChange;
import uk.digitalsquid.netspoofer.spoofs.CustomGalleryImageChange;
import uk.digitalsquid.netspoofer.spoofs.CustomTextChange;
import uk.digitalsquid.netspoofer.spoofs.ImageSpoof;
import uk.digitalsquid.netspoofer.spoofs.MultiSpoof;
import uk.digitalsquid.netspoofer.spoofs.NullSpoof;
Expand Down Expand Up @@ -69,11 +71,17 @@ public ArrayList<Spoof> getSpoofList() {
spoofs.add(new VideoChange(context, true));
spoofs.add(new VideoChange(context, false));

spoofs.add(new CustomTextChange(context));

spoofs.add(new RedirectSpoof(context, RedirectSpoof.MODE_BLUEBALL));
spoofs.add(new RedirectSpoof(context, RedirectSpoof.MODE_CUSTOM));

spoofs.add(new TitleChange(context, TitleChange.MODE_FLIP));
spoofs.add(new TitleChange(context, TitleChange.MODE_REVERSE));

spoofs.add(new ContentChange(context, ContentChange.MODE_FLIP));
spoofs.add(new ContentChange(context, ContentChange.MODE_GRAVITY));
spoofs.add(new ContentChange(context, ContentChange.MODE_DELETE));

Collections.sort(spoofs);

Expand Down
14 changes: 13 additions & 1 deletion src/uk/digitalsquid/netspoofer/proxy/NSProxy.java
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,8 @@ protected int doInBackground(StartParams params) {
Log.d(TAG, "Sending request");
HttpResponse response = executeRequest(request);
Log.d(TAG, "Response received");
manipulateResponse(response, request);
if(!whitelistRequest(request))
manipulateResponse(response, request);
Log.d(TAG, "Response manipulated");
output.write(String.format("HTTP/1.1 %d %s\r\n",
response.getResponseCode(),
Expand Down Expand Up @@ -278,4 +279,15 @@ private boolean filterRequest(HttpRequest request) {
if(host.contains(".dropbox.com")) return false;
return true;
}

/**
* Filters out requests that shouldn't be modified.
* @param request
* @return <code>true</code> if the request shouldn't be modified.
*/
private boolean whitelistRequest(HttpRequest request) {
String host = request.getHost();
if(host.equals("gravityscript.googlecode.com")) return true;
return false;
}
}
127 changes: 127 additions & 0 deletions src/uk/digitalsquid/netspoofer/spoofs/ContentChange.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
package uk.digitalsquid.netspoofer.spoofs;

import java.io.IOException;

import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.jsoup.nodes.TextNode;

import uk.digitalsquid.netspoofer.R;
import uk.digitalsquid.netspoofer.config.IOHelpers;
import uk.digitalsquid.netspoofer.config.Lists;
import uk.digitalsquid.netspoofer.config.LogConf;
import android.content.Context;
import android.content.res.Resources.NotFoundException;
import android.util.Log;

public class ContentChange extends HtmlEditorSpoof implements LogConf {

private static final long serialVersionUID = 792590861534877480L;
public static final int MODE_FLIP = 1;
public static final int MODE_GRAVITY = 2;
public static final int MODE_DELETE = 3;

private static String getTitle(Context context, int mode) {
switch(mode) {
case MODE_FLIP:
return context.getResources().getString(R.string.spoof_content_flip);
case MODE_GRAVITY:
return context.getResources().getString(R.string.spoof_gravity);
case MODE_DELETE:
return context.getResources().getString(R.string.spoof_delete);
default:
return "Unknown image spoof";
}
}
private static String getDescription(Context context, int mode) {
switch(mode) {
case MODE_FLIP:
return context.getResources().getString(R.string.spoof_content_flip_description);
case MODE_GRAVITY:
return context.getResources().getString(R.string.spoof_gravity_description);
case MODE_DELETE:
return context.getResources().getString(R.string.spoof_delete_description);
default:
return "";
}
}

protected final int mode;

private final String js;

public ContentChange(Context context, int mode) {
super(getTitle(context, mode), getDescription(context, mode));
this.mode = mode;
switch(mode) {
default:
case MODE_GRAVITY:
js = "<script src=\"http://gravityscript.googlecode.com/svn/trunk/gravityscript.js\"></script>";
break;
case MODE_DELETE:
String payload = "";
try {
payload = IOHelpers.readFileContents(
context.getResources().openRawResource(R.raw.js_removewords));
} catch (NotFoundException e) {
Log.w(TAG, "Failed to load js_removewords payload", e);
} catch (IOException e) {
Log.w(TAG, "Failed to load js_removewords payload", e);
}
js = payload;
break;
}
}

/**
* If using a custom mode it MUST NOT collide with existing modes.
* @param title
* @param description
* @param mode
*/
protected ContentChange(String title, String description, int mode) {
super(title, description);
js = "";
this.mode = mode;
}

@Override
protected void modifyDocument(Document document, Element body) {
switch(mode) {
default: // To allow custom implementations to pass through
case MODE_FLIP:
modifyElement(body);
break;
case MODE_GRAVITY:
case MODE_DELETE:
document.select("head").append(js);
break;

}
}

/**
* Recursively modifies an element according to mode.
* @param element
*/
private void modifyElement(Element element) {
for(Node node : element.childNodes()) {
if(node instanceof TextNode) {
modifyTextNode((TextNode) node);
} else if(node instanceof Element) {
modifyElement((Element) node);
}
}
}

protected void modifyTextNode(TextNode node) {
switch(mode) {
case MODE_FLIP:
String reversed =
new StringBuilder(node.text()).reverse().toString();
node.text(Lists.map(TitleChange.upsideDown, reversed));
break;
}
}
}
34 changes: 20 additions & 14 deletions src/uk/digitalsquid/netspoofer/spoofs/CustomTextChange.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,7 @@
import java.util.HashMap;
import java.util.Map;

import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.TextNode;

import uk.digitalsquid.netspoofer.R;
import android.app.AlertDialog;
Expand All @@ -43,12 +42,14 @@
* @author Will Shackleton <[email protected]>
*
*/
public class CustomTextChange extends HtmlEditorSpoof {
public class CustomTextChange extends ContentChange {
private static final long serialVersionUID = 8490503138296852028L;

private static final int MODE = 1005;

public CustomTextChange() {
// TODO: Localise
super("Text change", "Change all text on all websites");
public CustomTextChange(Context context) {
super(context.getResources().getString(R.string.spoof_textchange),
context.getResources().getString(R.string.spoof_textchange_description), MODE);
}

private final Map<String, String> changeValues = new HashMap<String, String>(8);
Expand Down Expand Up @@ -134,14 +135,19 @@ public void onClick(DialogInterface dialog, int which) {
}

@Override
public Map<String, String> getCustomEnv() {
return changeValues;
}

@Override
protected void modifyDocument(Document document, Element body) {
if(body != null) {

protected void modifyTextNode(TextNode node) {
super.modifyTextNode(node);
switch(mode) {
case MODE:
String text = node.text();
for(int i = 0 ; i < 8; i++) {
String from = changeValues.get(String.format("TEXT%dOLD", i));
String to = changeValues.get(String.format("TEXT%dNEW", i));
if(from != null && to != null)
text = text.replace(from, to);
}
node.text(text);
break;
}
}
}
9 changes: 2 additions & 7 deletions src/uk/digitalsquid/netspoofer/spoofs/TitleChange.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import org.jsoup.select.Elements;

import uk.digitalsquid.netspoofer.R;
import uk.digitalsquid.netspoofer.config.Lists;
import android.content.Context;

public class TitleChange extends HtmlEditorSpoof {
Expand Down Expand Up @@ -52,13 +53,7 @@ protected void modifyDocument(Document document, Element body) {
Element title = titles.first();
String reversed =
new StringBuilder(title.text()).reverse().toString();
StringBuilder result = new StringBuilder(reversed.length());
for(char c : reversed.toCharArray()) {
Character ud = upsideDown.get(c);
if(ud == null) ud = c;
result.append(ud);
}
title.text(result.toString());
title.text(Lists.map(upsideDown, reversed));
}
break;
case MODE_REVERSE:
Expand Down

0 comments on commit b4e9c63

Please sign in to comment.