package com.openfarmanager.android.filesystem.actions; import android.util.Log; import com.openfarmanager.android.App; import com.openfarmanager.android.model.exeptions.RootOperationException; import java.io.*; import java.util.ArrayList; /** * Created by sergii on 1/27/2014. */ public class RootTask { public static void delete(File file) { if (!LinuxShell.isRoot() || LinuxShell.execute("rm -r " + LinuxShell.getCmdPath(file.getAbsolutePath())) == null) { throw new RootOperationException("Root access is not granted or operation is failed"); } } public static boolean create(File file, boolean createDirectory) { return LinuxShell.isRoot() && (createDirectory ? LinuxShell.execute("mkdir " + LinuxShell.getCmdPath(file.getAbsolutePath())) != null : LinuxShell.execute("cat > " + LinuxShell.getCmdPath(file.getAbsolutePath())) != null); } public static boolean move(File file, File destination) { if (copy(file, new File(destination.getAbsolutePath() + "/" + file.getName()))) { delete(file); return true; } return false; } public static boolean rename(String absolutePath, String destinationFilePath) { return LinuxShell.isRoot() && LinuxShell.execute("mv " + LinuxShell.getCmdPath(absolutePath) + " " + LinuxShell.getCmdPath(destinationFilePath)) != null; } public static String[] ls(File path) { if (!LinuxShell.isRoot()) { return null; } ArrayList<String> result = new ArrayList<String>(); BufferedReader reader; try { reader = LinuxShell.execute("ls " + LinuxShell.getCmdPath(path.getAbsolutePath())); if (reader == null) return null; String line; while ((line = reader.readLine()) != null) { result.add(line); } reader.close(); } catch (Exception e) { e.printStackTrace(); } return result.toArray(new String[result.size()]); } public static boolean copy(File file, File destination) { return LinuxShell.isRoot() && LinuxShell.execute("cat " + LinuxShell.getCmdPath(file.getAbsolutePath()) + " > " + LinuxShell.getCmdPath(destination.getAbsolutePath())) != null; } public static boolean canReadFile(File file) { if(!RootTask.LinuxShell.isRoot()){ return false; } BufferedReader reader = LinuxShell.execute("cat " + LinuxShell.getCmdPath(file.getAbsolutePath())); try { reader.read(); reader.close(); return true; } catch (IOException e) { e.printStackTrace(); } return false; } public static BufferedReader readFile(File file) { if(!RootTask.LinuxShell.isRoot()){ return null; } try { return LinuxShell.execute("cat " + LinuxShell.getCmdPath(file.getAbsolutePath())); } catch (Exception e) { e.printStackTrace(); } return null; } public static boolean saveFile(File file, String content) { if(!RootTask.LinuxShell.isRoot()) { return false; } try { LinuxShell.execute("echo " + LinuxShell.getCmdPath(content) + " > " + LinuxShell.getCmdPath(file.getAbsolutePath())); return true; } catch (Exception e) { e.printStackTrace(); } return false; } public static boolean requestRootsAccess(){ return LinuxShell.isRootTools(); } private static class LinuxShell { public static String getCmdPath(String path) { return path.replace(" ", "\\ ").replace("'", "\\'"); } public static BufferedReader execute(String cmd) { BufferedReader reader; try { Process process = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(process.getOutputStream()); os.writeBytes(cmd + "\n"); os.writeBytes("exit\n"); reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String err = (new BufferedReader(new InputStreamReader(process.getErrorStream()))).readLine(); os.flush(); if (process.waitFor() != 0 || (!"".equals(err) && null != err)) { Log.e("920TERoot", err); return null; } return reader; } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return null; } public static boolean isRoot() { return App.sInstance.getSettings().getRootEnabled() && isRootTools(); } public static boolean isRootTools() { boolean retval = false; Process suProcess; try { suProcess = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(suProcess.getOutputStream()); DataInputStream osRes = new DataInputStream(suProcess.getInputStream()); if (null != os && null != osRes) { // Getting the id of the current user to check if this is root os.writeBytes("id\n"); os.flush(); String currUid = osRes.readLine(); boolean exitSu; if (null == currUid) { retval = false; exitSu = false; Log.e("ROOT", "Can't get root access or denied by user"); } else if (currUid.contains("uid=0")) { retval = true; exitSu = true; } else { retval = false; exitSu = true; Log.e("ROOT", "Root access rejected: " + currUid); } if (exitSu) { os.writeBytes("exit\n"); os.flush(); } } } catch (Exception e) { // Can't get root ! // Probably broken pipe exception on trying to write to output // stream after su failed, meaning that the device is not rooted retval = false; Log.e("ROOT", "Root access rejected [" + e.getClass().getName() + "] : " + e.getMessage()); } return retval; } } }