一些背景知识对我的问题:
我正在写一个编译器,域类型强制规范转换成Java安全管理代码。 概括地说,DTE定义的“类型”(对象),分配路径的那些类型; 然后定义“结构域”(受试者),并且定义了什么权限(rwxdc)结构域具有各种类型。 我需要在JSM尽可能地模仿这种行为。
目前我正在写权限。 我已经成功地覆盖了JSM器的checkWrite(字符串文件名)方法。 其次在名单上是checkWrite(FileDescriptor的文件描述符),这是一个棘手的证明。 由于DTE的定义方式,我需要路径信息来确定写入操作是否是允许的。
是否有可能从FileDescriptor的提取路径数据? 我猜没有 - 我检查的文件和各种教程,我发现没有任何证据表明有任何但是办法,我获得此信息(我很高兴能够显示错误的;那会让我的工作变得更轻松)。
如果答案以上是NO,任何人都可以提出一个可行的解决方法吗? 例如,有一些方法我可以写本地代码做我想做什么,扎入我的自定义类JSM这个? 我很好做一些“先进”这样的,但我需要一些想法如何开始。
或者是我唯一的选择基本上否认使用FileDescriptor的所有写权限? 我非常想避免这种情况,因为这是一个糟糕的解决方案,但如果这是我需要知道的现实。
非常感谢你花时间陪伴。
简短的回答是否定的,因为文件是独立于用于访问(至少在这方面存在任何OS)该文件的路径。
一种可能的解决办法是捕获调用打开文件,使用方面的框架,并把引用的文件描述成WeakHashMap<FileDescriptor,File>
。 然后,你只需看这张图时,你需要验证的写操作。
该解决方案摆脱的FileDescriptor在java中的路径:
这个怎么运作:
我们知道,文件描述符包含描述符标识来定位当前进程打开的文件。
什么是文件描述符,深入浅出的解释呢?
如果我们知道描述符标识那么我们可以通过下面的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中的一个目录中包含系统中运行的所有进程
/自当前运行的Java类进程id
/ 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.h SafeFileDescriptor.java
javac -h dir SafeFileDescriptor.java
取代“目录”与您的目录来存放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");