package biz.bokhorst.xprivacy;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import android.text.TextUtils;
import android.util.Log;
public class XProcessBuilder extends XHook {
private String mCommand;
private XProcessBuilder(String methodName, String restrictionName, String command) {
super(restrictionName, methodName, command);
mCommand = command;
}
public String getClassName() {
return "java.lang.ProcessBuilder";
}
// public Process start()
// libcore/luni/src/main/java/java/lang/ProcessBuilder.java
// http://developer.android.com/reference/java/lang/ProcessBuilder.html
public static List<XHook> getInstances() {
List<XHook> listHook = new ArrayList<XHook>();
listHook.add(new XProcessBuilder("start", PrivacyManager.cShell, "sh"));
listHook.add(new XProcessBuilder("start", PrivacyManager.cShell, "su"));
listHook.add(new XProcessBuilder("start", PrivacyManager.cShell, null));
return listHook;
}
@Override
protected void before(XParam param) throws Throwable {
String methodName = param.method.getName();
if (methodName.equals("start")) {
// Get commands
ProcessBuilder builder = (ProcessBuilder) param.thisObject;
List<String> listProg = (builder == null ? null : builder.command());
// Check commands
if (listProg != null) {
String command = TextUtils.join(" ", listProg);
if (XRuntime.matches(command, mCommand) && isRestrictedExtra(param, command))
param.setThrowable(new IOException("XPrivacy"));
}
} else
Util.log(this, Log.WARN, "Unknown method=" + methodName);
}
@Override
protected void after(XParam param) throws Throwable {
// Do nothing
}
}