aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/fil/libre/repwifiapp/helpers/Engine.java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/fil/libre/repwifiapp/helpers/Engine.java')
-rw-r--r--app/src/fil/libre/repwifiapp/helpers/Engine.java859
1 files changed, 430 insertions, 429 deletions
diff --git a/app/src/fil/libre/repwifiapp/helpers/Engine.java b/app/src/fil/libre/repwifiapp/helpers/Engine.java
index 5a2f2b2..68d8745 100644
--- a/app/src/fil/libre/repwifiapp/helpers/Engine.java
+++ b/app/src/fil/libre/repwifiapp/helpers/Engine.java
@@ -20,449 +20,450 @@
package fil.libre.repwifiapp.helpers;
+import java.net.NetworkInterface;
+import java.net.SocketException;
import java.util.ArrayList;
+import java.util.Enumeration;
import fil.libre.repwifiapp.Commons;
+public abstract class Engine implements IEngine {
-public abstract class Engine implements IEngine{
-
- public static final String DNS1 = "193.183.98.154";
- public static final String DNS2 = "87.98.175.85";
-
- protected String getCmdWpaSup(){
- return "wpa_supplicant -B -dd -i" + Commons.INTERFACE_NAME + " -C\"" +Commons.SOCKET_DIR + "\" -P\"" + Commons.PID_FILE + "\"";
- }
-
- protected String getCmdWpaCli() {
- return "wpa_cli -p" + Commons.SOCKET_DIR + " -P" + Commons.PID_FILE + " -i" + Commons.INTERFACE_NAME;
- }
-
- protected abstract String getCmdWpaStart();
-
- public boolean deleteFileIfExists(String filePath){
-
- if (filePath == null){
- return false;
- }
-
- if (filePath.contains("*")){
- //it's safer to reject bulk rm'ing
- return false;
- }
-
- if (filePath.contains(" -r ")){
- //only file rm'ing acceppted
- return false;
- }
-
- //needs root (it only gets used by the 4p2 engine, working in /data/misc/wifi)
- return executeRootCmd("if [ -e \""+ filePath + "\" ]; then rm \"" + filePath + "\"; fi");
-
- }
-
- public boolean chmodFile(String filePath, String mod){
- //needs root (chmod)
- return executeRootCmd("chmod " + mod + " \"" + filePath + "\"");
- }
-
- @Override
- public boolean killPreviousConnections() {
-
- //needs root (for killall)
-
- Utils.logDebug("killing wpa_supplicant..:");
- if (executeRootCmd("killall -SIGINT wpa_supplicant")){
- Utils.logDebug("Killed wpa_supplicant");
- }else{
- Utils.logDebug("Wpa_supplicant NOT killed.");
- }
-
- Utils.logDebug("killing dhcpcd..");
- if (executeRootCmd("killall -SIGINT dhcpcd")){
- Utils.logDebug("Killed dhcpcd");
- }else{
- Utils.logDebug("dhcpcd NOT killed.");
- }
-
-
- return true;
-
- }
-
- @Override
- public boolean clearWorkingDir(){
-
- //needs root (to work within /data/misc/wifi)
-
- Utils.logDebug("clearWorkingDir():");
-
- if (executeRootCmd("rm -r " + Commons.SOCKET_DIR)){
- Utils.logDebug("removed socket dir");
- }
-
- if (executeRootCmd("rm " + Commons.ENTROPY_FILE)){
- Utils.logDebug("removed entropy file");
- }
-
- if (executeRootCmd("rm " + Commons.PID_FILE)){
- Utils.logDebug("removed pidfile");
- }
-
- if (executeRootCmd("rm " + Commons.SOFTAP_FILE)){
- Utils.logDebug("removed softap file");
- }
-
- if (executeRootCmd("rm " + Commons.WPA_CONF)){
- Utils.logDebug("removed wpa conf file");
- }
-
- if (executeRootCmd("rm " + Commons.P2P_CONF)){
- Utils.logDebug("removed p2p conf file");
- }
-
-
- return true;
-
- }
-
- @Override
- public boolean startWpaSupplicant(){
-
- Utils.logDebug("startWpaSupplicant():");
-
- //needs root (for wpa_supplicant)
- if (executeRootCmd(getCmdWpaSup())){
- return true;
- }else{
- Utils.logDebug("Failed to start wpa");
- return false;
- }
-
- }
-
- @Override
- public AccessPointInfo[] getAvailableNetworks(){
-
- Utils.logDebug("getAvailableNetworks():");
-
- killPreviousConnections();
-
- //is it really necessary??? --- Fil
- if (! clearWorkingDir()){
- Utils.logError("Failed clearing dir");
- return null;
- }
-
- if (! startWpaSupplicant()){
- Utils.logError("Failed starting wpa_supplicant");
- return null;
- }
-
- if (! createScanScripts()){
- Utils.logError("Failed creating scripts");
- return null;
- }
-
- if (! scanNetworks()){
- Utils.logError("failed scanning networks");
- return null;
- }
-
- if (!getScanResults()){
- Utils.logError("failed getting scan results");
- return null;
- }
-
- //chmod 664 scan_file to make it readable
- if (!chmodFile(Commons.getScanFile(), "664")){
- Utils.logError("failed chmodding scan_file");
- return null;
- }
-
- AccessPointInfo[] a = AccessPointInfo.parseScanResult(Commons.getScanFile());
- if (a == null){
- Utils.logError("Unable to parse scan file into AccessPointInfo array");
- }
-
- return a;
-
- }
-
- @Override
- public abstract boolean connect(AccessPointInfo info);
-
- @Override
- public boolean disconnect(){
-
- //needs root (for wpa_cli)
-
- if (! isWpaSupplicantRunning()){
- return true;
- }
-
- try {
-
- RootCommand su = new RootCommand(getCmdWpaCli() + " disconnect");
- if (su.execute() == 0){
- String out = su.getOutput();
- if (out != null && out.trim().replace("\n", "").equals("OK")){
- return true;
- }else {
- return false;
- }
- }
- else{
- return false;
- }
-
- } catch (Exception e) {
- Utils.logError("Error while enabling network", e);
- return false;
- }
- }
-
- /***
- * returns null if unable to determine connection status for any reason.
- */
- @Override
- public ConnectionStatus getConnectionStatus(){
-
- Utils.logDebug("called getConnecitonStatus()");
- if (! isWpaSupplicantRunning()){
- //wpa_supplicant is not running.
- //unable to determin status.
- Utils.logDebug("wpa not running, cannot get connection status.");
- return null;
-
- }
-
- try {
-
- RootCommand su = new RootCommand(getCmdWpaCli() + " status");
- if(su.execute() == 0){
- String out = su.getOutput();
- if (out == null || out.trim().equals("")){
- return null;
- }
- else {
- return ConnectionStatus.parseWpaCliOutput(out);
- }
- }
- else {
- return null;
- }
-
- } catch (Exception e) {
- Utils.logError("Error while executing wpa_cli status", e);
- return null;
- }
-
- }
-
- @Override
- public boolean isInterfaceAvailable(String ifaceName){
-
- String[]ifaces = getAvailableInterfaces();
- if(ifaces == null || ifaces.length == 0){
- return false;
- }
-
- for(String name : ifaces){
- if (name.equals(ifaceName)){
- return true;
- }
- }
-
- return false;
- }
-
- @Override
- public String[] getAvailableInterfaces(){
-
- try {
-
- ShellCommand cmd = new ShellCommand("ip link");
- if (cmd.execute() == 0){
-
- String out = cmd.getOutput();
- if (out == null || out.contains("\n") == false){
- Utils.logDebug("No out from ip link");
- return null;
- }
-
- ArrayList<String> list = new ArrayList<String>();
-
- String[] lines = out.split("\n");
- for (String l : lines){
-
- String[] fields = l.split(":");
- if (fields.length != 3){
- continue;
- }
-
- String interfName = fields[1].trim();
- list.add(interfName);
-
- }
-
- String[] retArr = new String[list.size()];
- retArr = list.toArray(retArr);
-
- return retArr;
-
- }
- else{
- return null;
- }
-
- } catch (Exception e) {
- Utils.logError("Error while querying ip link", e);
- return null;
- }
-
- }
-
- public boolean runDhcpcd(){
-
- //needs root
- return executeRootCmd("dhcpcd " + Commons.INTERFACE_NAME);
-
- }
-
- public boolean interfaceUp(){
- //needs root (tested)
- return executeRootCmd("ifconfig " + Commons.INTERFACE_NAME + " up");
- }
-
- protected boolean executeCmd(String cmd){
-
- try {
-
- ShellCommand c = new ShellCommand(cmd);
- if ( c.execute() == 0){
- return true;
- }else {
- return false;
- }
-
- } catch (Exception e) {
- Utils.logError("Error executing \"" + cmd + "\"",e);
- return false;
- }
-
- }
-
- protected boolean executeRootCmd(String cmd){
-
- try {
-
- RootCommand c = new RootCommand(cmd);
- if ( c.execute() == 0){
- return true;
- }else {
- return false;
- }
-
- } catch (Exception e) {
- Utils.logError("Error executing \"" + cmd + "\"",e);
- return false;
- }
- }
-
- protected boolean isWpaSupplicantRunning(){
-
- boolean retval = false;
-
- try {
-
- RootCommand su = new RootCommand("pidof wpa_supplicant");
- if (su.execute() == 0){
-
- if (su.getOutput().trim().equals("")){
- retval = false;
- }else{
- retval = true;
- }
-
- }else {
- retval = false;
- }
-
-
- } catch (Exception e) {
- Utils.logError("Exception during isWpaSupplicantRunning()",e);
- retval = false;
- }
-
- return retval;
-
- }
-
- protected boolean scanNetworks(){
-
- //needs root (for wpa_supplicant and wpa_cli)
- return executeRootCmd("bash " + Commons.getScriptScan());
-
- }
-
- protected boolean getScanResults(){
-
- //needs root (for wpa_supplicant and wpa_cli)
- return executeRootCmd("bash " + Commons.getScriptScanRes());
-
- }
-
- protected boolean createScanScripts(){
-
- try {
-
- String scan = getCmdWpaCli() + " scan\n" +
- "if [ $? -ne 0 ]; then\n" +
- "exit 1\n" +
- "fi\n" +
- "sleep 2s\n";
-
- String scanRes = "if [ -e \"" + Commons.getScanFile() + "\" ]; then\n" +
- " rm \"" + Commons.getScanFile() + "\"\n" +
- "fi\n" +
- getCmdWpaCli() + " scan_results > \""+ Commons.getScanFile() + "\"\n" +
- "if [ $? -ne 0 ]; then\n" +
- " exit 1\n" +
- "fi\n" +
- "sleep 1s\n";
+ protected String getCmdWpaSup() {
+ return "wpa_supplicant -B -dd -i" + Commons.INTERFACE_NAME + " -C" + Commons.SOCKET_DIR
+ + " -P" + Commons.PID_FILE + " -I" + Commons.OVERLAY_FILE + " -e"
+ + Commons.ENTROPY_FILE;
+ }
-
- if (! Utils.writeFile(Commons.getScriptScan(),scan,true) ){
+ protected String getCmdWpaCli() {
+ return "wpa_cli -p" + Commons.SOCKET_DIR + " -P" + Commons.PID_FILE + " -i"
+ + Commons.INTERFACE_NAME;
+ }
- Exception e = Utils.getLastException();
- if (e != null){
- Utils.logError("Error while writing scan script.",e);
- }
+ protected abstract String getCmdWpaStart();
- return false;
- }
+ public boolean deleteFileIfExists(String filePath) {
-
- if (! Utils.writeFile(Commons.getScriptScanRes(),scanRes,true) ){
+ if (filePath == null) {
+ return false;
+ }
- Exception e = Utils.getLastException();
- if (e != null){
- Utils.logError("Error while writing getScanResults script.",e);
- }
+ if (filePath.contains("*")) {
+ // it's safer to reject bulk rm'ing
+ return false;
+ }
- return false;
- }
+ if (filePath.contains(" -r ")) {
+ // only file rm'ing acceppted
+ return false;
+ }
+ // needs root (it only gets used by the 4p2 engine, working in
+ // /data/misc/wifi)
+ return executeRootCmd("if [ -e \"" + filePath + "\" ]; then rm \"" + filePath + "\"; fi");
- return true;
+ }
- } catch (Exception e) {
+ public boolean chmodFile(String filePath, String mod) {
+ // needs root (chmod)
+ return executeRootCmd("chmod " + mod + " \"" + filePath + "\"");
+ }
- Utils.logError("Error while creating the scanning script.",e);
- return false;
- }
+ @Override
+ public boolean killBackEndProcesses() {
- }
-
+ // needs root (for killall)
+
+ Utils.logDebug("killing wpa_supplicant..:");
+ if (executeRootCmd("killall -SIGINT wpa_supplicant")) {
+ Utils.logDebug("Killed wpa_supplicant");
+ } else {
+ Utils.logDebug("Wpa_supplicant NOT killed.");
+ }
+
+ Utils.logDebug("killing dhcpcd..");
+ if (executeRootCmd("killall -SIGINT dhcpcd")) {
+ Utils.logDebug("Killed dhcpcd");
+ } else {
+ Utils.logDebug("dhcpcd NOT killed.");
+ }
+
+ return true;
+
+ }
+
+ @Override
+ public boolean clearWorkingDir() {
+
+ // needs root (to work within /data/misc/wifi)
+
+ Utils.logDebug("clearWorkingDir():");
+
+ if (executeRootCmd("rm -r " + Commons.SOCKET_DIR)) {
+ Utils.logDebug("removed socket dir");
+ }
+
+ if (executeRootCmd("rm " + Commons.ENTROPY_FILE)) {
+ Utils.logDebug("removed entropy file");
+ }
+
+ if (executeRootCmd("rm " + Commons.PID_FILE)) {
+ Utils.logDebug("removed pidfile");
+ }
+
+ if (executeRootCmd("rm " + Commons.SOFTAP_FILE)) {
+ Utils.logDebug("removed softap file");
+ }
+
+ if (executeRootCmd("rm " + Commons.WPA_CONF)) {
+ Utils.logDebug("removed wpa conf file");
+ }
+
+ if (executeRootCmd("rm " + Commons.P2P_CONF)) {
+ Utils.logDebug("removed p2p conf file");
+ }
+
+ return true;
+
+ }
+
+ @Override
+ public boolean startWpaSupplicant() {
+
+ Utils.logDebug("startWpaSupplicant():");
+
+ // needs root (for wpa_supplicant)
+ if (executeRootCmd(getCmdWpaSup())) {
+ return true;
+ } else {
+ Utils.logDebug("Failed to start wpa");
+ return false;
+ }
+
+ }
+
+ @Override
+ public AccessPointInfo[] getAvailableNetworks() {
+
+ Utils.logDebug("getAvailableNetworks():");
+
+ // killPreviousConnections();
+
+ // Is it really necessary???
+ // seems that clearing /data/misc/wifi is NOT necessary
+ // so, commented out - Fil 2017-03-24
+ /*
+ * if (! clearWorkingDir()){ Utils.logError("Failed clearing dir");
+ * return null; }
+ */
+
+ if (!startWpaSupplicant()) {
+ Utils.logError("Failed starting wpa_supplicant");
+ return null;
+ }
+
+ if (!createScanScripts()) {
+ Utils.logError("Failed creating scripts");
+ return null;
+ }
+
+ if (!scanNetworks()) {
+ Utils.logError("failed scanning networks");
+ return null;
+ }
+
+ if (!getScanResults()) {
+ Utils.logError("failed getting scan results");
+ return null;
+ }
+
+ // chmod 664 scan_file to make it readable
+ /*
+ * if (!chmodFile(Commons.getScanFile(), "664")){
+ * Utils.logError("failed chmodding scan_file"); return null; }
+ */
+
+ AccessPointInfo[] a = AccessPointInfo.parseScanResult(Commons.getScanFile());
+ if (a == null) {
+ Utils.logError("Unable to parse scan file into AccessPointInfo array");
+ return a;
+ }
+
+ Utils.logDebug("# of APs found: " + a.length);
+
+ return a;
+
+ }
+
+ @Override
+ public abstract boolean connect(AccessPointInfo info);
+
+ @Override
+ public boolean disconnect() {
+
+ // needs root (for wpa_cli)
+
+ if (!isWpaSupplicantRunning()) {
+ return true;
+ }
+
+ try {
+
+ RootCommand su = new RootCommand(getCmdWpaCli() + " disconnect");
+ if (su.execute() == 0) {
+ String out = su.getOutput();
+ if (out != null && out.trim().replace("\n", "").equals("OK")) {
+ return true;
+ } else {
+ return false;
+ }
+ } else {
+ return false;
+ }
+
+ } catch (Exception e) {
+ Utils.logError("Error while enabling network", e);
+ return false;
+ }
+ }
+
+ /***
+ * returns null if unable to determine connection status for any reason.
+ */
+ @Override
+ public ConnectionStatus getConnectionStatus() {
+
+ Utils.logDebug("called getConnecitonStatus()");
+ if (!isWpaSupplicantRunning()) {
+ // wpa_supplicant is not running.
+ // unable to determin status.
+ Utils.logDebug("wpa not running, cannot get connection status.");
+ return null;
+
+ }
+
+ try {
+
+ RootCommand su = new RootCommand(getCmdWpaCli() + " status");
+ if (su.execute() == 0) {
+ String out = su.getOutput();
+ if (out == null || out.trim().equals("")) {
+ return null;
+ } else {
+ return ConnectionStatus.parseWpaCliOutput(out);
+ }
+ } else {
+ return null;
+ }
+
+ } catch (Exception e) {
+ Utils.logError("Error while executing wpa_cli status", e);
+ return null;
+ }
+
+ }
+
+ @Override
+ public boolean isInterfaceAvailable(String ifaceName) throws SocketException {
+
+ /*
+ * String[]ifaces = getAvailableInterfaces(); if(ifaces == null ||
+ * ifaces.length == 0){ return false; }
+ *
+ * for(String name : ifaces){
+ *
+ * if (name.equals(ifaceName)){ return true; } }
+ *
+ * return false;
+ */
+
+ Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
+ while (interfaces.hasMoreElements()) {
+ NetworkInterface nif = interfaces.nextElement();
+ String nm = nif.getName();
+ if (nm.equals(ifaceName)) {
+ return true;
+ }
+ }
+ return false;
+
+ }
+
+ @Override
+ public String[] getAvailableInterfaces() {
+
+ try {
+
+ // No need for root for "ip link"
+ // tested 2017-03-24 - Fil
+ ShellCommand cmd = new ShellCommand("ip link");
+ if (cmd.execute() == 0) {
+
+ String out = cmd.getOutput();
+ if (out == null || out.contains("\n") == false) {
+ Utils.logDebug("No out from ip link");
+ return null;
+ }
+
+ ArrayList<String> list = new ArrayList<String>();
+
+ String[] lines = out.split("\n");
+ for (String l : lines) {
+
+ String[] fields = l.split(":");
+ if (fields.length != 3) {
+ continue;
+ }
+
+ String interfName = fields[1].trim();
+ list.add(interfName);
+
+ }
+
+ String[] retArr = new String[list.size()];
+ retArr = list.toArray(retArr);
+
+ return retArr;
+
+ } else {
+ return null;
+ }
+
+ } catch (Exception e) {
+ Utils.logError("Error while querying ip link", e);
+ return null;
+ }
+
+ }
+
+ public boolean runDhcpcd() {
+
+ // needs root
+ return executeRootCmd("dhcpcd " + Commons.INTERFACE_NAME);
+
+ }
+
+ public boolean interfaceUp() {
+ // needs root (tested)
+ return executeRootCmd("ifconfig " + Commons.INTERFACE_NAME + " up");
+ }
+
+ /*
+ * protected boolean executeCmd(String cmd){
+ *
+ * try {
+ *
+ * ShellCommand c = new ShellCommand(cmd); if ( c.execute() == 0){ return
+ * true; }else { return false; }
+ *
+ * } catch (Exception e) { Utils.logError("Error executing \"" + cmd +
+ * "\"",e); return false; }
+ *
+ * }
+ */
+
+ protected boolean executeRootCmd(String cmd) {
+
+ try {
+
+ RootCommand c = new RootCommand(cmd);
+ if (c.execute() == 0) {
+ return true;
+ } else {
+ return false;
+ }
+
+ } catch (Exception e) {
+ Utils.logError("Error executing \"" + cmd + "\"", e);
+ return false;
+ }
+ }
+
+ protected boolean isWpaSupplicantRunning() {
+
+ boolean retval = false;
+
+ try {
+
+ RootCommand su = new RootCommand("pidof wpa_supplicant");
+ if (su.execute() == 0) {
+
+ if (su.getOutput().trim().equals("")) {
+ retval = false;
+ } else {
+ retval = true;
+ }
+
+ } else {
+ retval = false;
+ }
+
+ } catch (Exception e) {
+ Utils.logError("Exception during isWpaSupplicantRunning()", e);
+ retval = false;
+ }
+
+ return retval;
+
+ }
+
+ protected boolean scanNetworks() {
+
+ // needs root (for wpa_supplicant and wpa_cli)
+ return executeRootCmd("bash " + Commons.getScriptScan());
+
+ }
+
+ protected boolean getScanResults() {
+
+ // needs root (for wpa_supplicant and wpa_cli)
+ boolean res = executeRootCmd("bash " + Commons.getScriptScanRes());
+ if (!res) {
+ return false;
+ }
+ return res;
+
+ }
+
+ protected boolean createScanScripts() {
+
+ try {
+
+ String scan = getCmdWpaCli() + " scan\n" + "if [ $? -ne 0 ]; then\n" + "exit 1\n"
+ + "fi\n" + "sleep 2s\n";
+
+ String scanRes = "if [ -e \"" + Commons.getScanFile() + "\" ]; then\n" + " rm \""
+ + Commons.getScanFile() + "\"\n" + "fi\n" + getCmdWpaCli()
+ + " scan_results > \"" + Commons.getScanFile() + "\"\n"
+ + "if [ $? -ne 0 ]; then\n" + " exit 1\n" + "fi\n";
+
+ if (!Utils.writeFile(Commons.getScriptScan(), scan, true)) {
+
+ Exception e = Utils.getLastException();
+ if (e != null) {
+ Utils.logError("Error while writing scan script.", e);
+ }
+
+ return false;
+ }
+
+ if (!Utils.writeFile(Commons.getScriptScanRes(), scanRes, true)) {
+
+ Exception e = Utils.getLastException();
+ if (e != null) {
+ Utils.logError("Error while writing getScanResults script.", e);
+ }
+
+ return false;
+ }
+
+ return true;
+
+ } catch (Exception e) {
+
+ Utils.logError("Error while creating the scanning script.", e);
+ return false;
+ }
+
+ }
}