关于我的问题的一些快速背景:
我正在编写一个编译器,它将域类型强制执行规范转换为Java安全管理器代码。简而言之,DTE定义“类型”(对象),为这些类型分配路径;然后定义“域”(subjects),并定义对各种类型的权限(rwxdc)。我需要在JSM中尽可能地模仿这种行为。
目前,我正在研究写权限。我已经成功地重写了JSM的checkWrite(String )方法。列表中的下一个是checkWrite(FileDescriptor filedescriptor),事实证明这个更棘手。由于DTE的定义方式,我需要路径信息来确定是否允许写操作。
非常感谢你抽出时间。
发布于 2012-09-05 17:24:38
简单来说,答案是否定的,因为一个文件独立于用于访问该文件的路径(至少在任何重要的操作系统上都是如此)。
一个可能的解决方法是使用方面框架捕获打开文件的调用,并将引用的文件描述符放入WeakHashMap<FileDescriptor,File>中。然后,每当需要验证写入时,您只需查看此映射即可。
发布于 2020-06-27 10:36:11
希望不会被反射限制所阻止,但是现在您可以使用这个(基于另一个答案的代码),从Android开始:
val file = File(filesDir, "ff")
file.parentFile!!.mkdirs()
val fileOutputStream = FileOutputStream(file)
val fd = fileOutputStream.fd
val method = fd.javaClass.getMethod("getInt$")
val fdId = method.invoke(fd)
val path = Paths.get("/proc/self/fd/$fdId")
val filePath = Files.readSymbolicLink(path)
Log.d("AppLog", "filePath:$filePath")不过,对FileChannel并不确定。它的实现文件("FileChannelImpl")应该有“路径”(文件路径字符串类型)和"fd“,后者是FileDescriptor,但两者都是通过反射隐藏的。
发布于 2019-05-14 06:19:17
在java中从FileDescriptor获取路径的解决方案:
的工作方式:
我们知道文件描述符包含描述符id来定位当前进程中打开的文件。
What are file descriptors, explained in simple terms?
如果我们知道描述符id,那么我们可以很容易地通过以下java代码找到文件路径:
Path path = Paths.get("/proc/self/fd/"+fd_id);
System.out.println(Files.readSymbolicLink(path)); //return file path in file descriptor在此:
fd_id文件描述符id (0,1,2 .) /proc its目录包含系统中运行的所有进程 当前运行java类进程id的/self /fd文件描述符目录 //fd_id文件描述符id
SafeFileDescriptor.java
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.nio.file.Path;
public class SafeFileDescriptor {
static {
System.load("Documents/java native interface exmples/libSafeFileDescriptor.so");
}
private native int getFDid(FileDescriptor fd);
public static void main(String[] args) throws IOException{
FileOutputStream fout = new FileOutputStream("Documents/test.txt");
FileDescriptor fd=fout.getFD();
int fd_id = new SafeFileDescriptor().getFDid(fd);
Path path = Paths.get("/proc/self/fd/"+fd_id);
System.out.println(Files.readSymbolicLink(path));
}
}getFDid()是一个本机方法,用于获取给定文件描述符对象的描述符id。
下面的代码是getFDid()本机方法的实现
SafeFileDescriptor.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class SafeFileDescriptor */
#ifndef _Included_SafeFileDescriptor
#define _Included_SafeFileDescriptor
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: SafeFileDescriptor
* Method: getFDid
* Signature: (Ljava/io/FileDescriptor;)I
*/
JNIEXPORT jint JNICALL Java_SafeFileDescriptor_getFDid
(JNIEnv *, jobject, jobject);
#ifdef __cplusplus
}
#endif
#endif从java文件SafeFileDescriptor.java创建SafeFileDescriptor.h
javac -h dir SafeFileDescriptor.java用目录替换"dir“以存储SafeFileDescriptor.h
SafeFileDescriptor.c
#include <jni.h>
#include "SafeFileDescriptor.h"
JNIEXPORT jint JNICALL Java_SafeFileDescriptor_getFDid
(JNIEnv *env, jobject this_object, jobject fdObject) {
jclass fileDescriptor = (*env)->GetObjectClass(env,fdObject);
jfieldID id_fd = (*env)->GetFieldID(env, fileDescriptor, "fd", "I");
return (*env)->GetIntField(env,fdObject,id_fd);
}编译SafeFileDescriptor.c
gcc -fPIC -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" -shared -o libSafeFileDescriptor.so SafeFileDescriptor.c将libSafeFileDescriptor.so文件添加到java类文件
System.load("Documents/java native interface exmples/libSafeFileDescriptor.so");https://stackoverflow.com/questions/12285469
复制相似问题