mirror of
https://github.com/fankes/termux-app.git
synced 2025-09-07 11:09:49 +08:00
Added: Add SELinuxUtils
to get process and file paths security contexts
This commit is contained in:
@@ -0,0 +1,96 @@
|
|||||||
|
package com.termux.shared.android;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.termux.shared.logger.Logger;
|
||||||
|
import com.termux.shared.reflection.ReflectionUtils;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
public class SELinuxUtils {
|
||||||
|
|
||||||
|
public static final String ANDROID_OS_SELINUX_CLASS = "android.os.SELinux";
|
||||||
|
|
||||||
|
private static final String LOG_TAG = "SELinuxUtils";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the security context of the current process.
|
||||||
|
*
|
||||||
|
* @return Returns a {@link String} representing the security context of the current process.
|
||||||
|
* This will be {@code null} if an exception is raised.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public static String getContext() {
|
||||||
|
ReflectionUtils.bypassHiddenAPIReflectionRestrictions();
|
||||||
|
String methodName = "getContext";
|
||||||
|
try {
|
||||||
|
@SuppressLint("PrivateApi") Class<?> clazz = Class.forName(ANDROID_OS_SELINUX_CLASS);
|
||||||
|
Method method = ReflectionUtils.getDeclaredMethod(clazz, methodName);
|
||||||
|
if (method == null) {
|
||||||
|
Logger.logError(LOG_TAG, "Failed to get " + methodName + "() method of " + ANDROID_OS_SELINUX_CLASS + " class");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (String) ReflectionUtils.invokeMethod(method, null).value;
|
||||||
|
} catch (Exception e) {
|
||||||
|
Logger.logStackTraceWithMessage(LOG_TAG, "Failed to call " + methodName + "() method of " + ANDROID_OS_SELINUX_CLASS + " class", e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the security context of a given process id.
|
||||||
|
*
|
||||||
|
* @param pid The pid of process.
|
||||||
|
* @return Returns a {@link String} representing the security context of the given pid.
|
||||||
|
* This will be {@code null} if an exception is raised.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public static String getPidContext(int pid) {
|
||||||
|
ReflectionUtils.bypassHiddenAPIReflectionRestrictions();
|
||||||
|
String methodName = "getPidContext";
|
||||||
|
try {
|
||||||
|
@SuppressLint("PrivateApi") Class<?> clazz = Class.forName(ANDROID_OS_SELINUX_CLASS);
|
||||||
|
Method method = ReflectionUtils.getDeclaredMethod(clazz, methodName, int.class);
|
||||||
|
if (method == null) {
|
||||||
|
Logger.logError(LOG_TAG, "Failed to get " + methodName + "() method of " + ANDROID_OS_SELINUX_CLASS + " class");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (String) ReflectionUtils.invokeMethod(method, null, pid).value;
|
||||||
|
} catch (Exception e) {
|
||||||
|
Logger.logStackTraceWithMessage(LOG_TAG, "Failed to call " + methodName + "() method of " + ANDROID_OS_SELINUX_CLASS + " class", e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the security context of a file object.
|
||||||
|
*
|
||||||
|
* @param path The pathname of the file object.
|
||||||
|
* @return Returns a {@link String} representing the security context of the file.
|
||||||
|
* This will be {@code null} if an exception is raised.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public static String getFileContext(@NonNull String path) {
|
||||||
|
ReflectionUtils.bypassHiddenAPIReflectionRestrictions();
|
||||||
|
String methodName = "getFileContext";
|
||||||
|
try {
|
||||||
|
@SuppressLint("PrivateApi") Class<?> clazz = Class.forName(ANDROID_OS_SELINUX_CLASS);
|
||||||
|
Method method = ReflectionUtils.getDeclaredMethod(clazz, methodName, String.class);
|
||||||
|
if (method == null) {
|
||||||
|
Logger.logError(LOG_TAG, "Failed to get " + methodName + "() method of " + ANDROID_OS_SELINUX_CLASS + " class");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (String) ReflectionUtils.invokeMethod(method, null, path).value;
|
||||||
|
} catch (Exception e) {
|
||||||
|
Logger.logStackTraceWithMessage(LOG_TAG, "Failed to call " + methodName + "() method of " + ANDROID_OS_SELINUX_CLASS + " class", e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user