Системный вызов Linux не работает должным образом

Я пытаюсь выполнить файловые операции в зависимости от пользователя, вошедшего в систему в моем веб-приложении Java. Для этого я использовал собственную реализацию JNI, чтобы установить для fs uid & fs gid зарегистрированный пользователь uid и gid. Теперь файловые операции разрешены, только если у вошедшего в систему пользователя есть разрешения.

Я также хочу узнать, есть ли у вошедшего в систему пользователя права на чтение / запись / выполнение файла. Пытался использовать доступ, системные вызовы faccessat, но, похоже, они не используют фид.

Как получить права доступа к файлам для вошедшего в систему пользователя?

1 ответ

Нашел простой способ решения проблемы. Не уверен, насколько это завершено. Это не принимает acls во внимание.

struct passwd *pw = getpwnam(userName);
if (pw == NULL) {
    return NULL;
}
jint fill[3];//rwx - 1 indicates success, 0 indicates failure
if(pw->pw_uid == 0) {
    fill[0] = fill[1] = fill[2] = 1;
} else {
    struct stat info;
    stat(path, &info);
    int mode = info.st_mode;

    if(pw->pw_uid == info.st_uid) {
        fill[0] = mode & S_IRUSR ? 1 : 0;    /* 3 bits for user  */
        fill[1] = mode & S_IWUSR ? 1 : 0;
        fill[2] = mode & S_IXUSR ? 1 : 0;
    } else if(pw->pw_gid == info.st_gid) {
        fill[0] = mode & S_IRGRP ? 1 : 0;    /* 3 bits for group  */
        fill[1] = mode & S_IWGRP ? 1 : 0;
        fill[2] = mode & S_IXGRP ? 1 : 0;
    } else {
        fill[0] = mode & S_IROTH ? 1 : 0;    /* 3 bits for group  */
        fill[1] = mode & S_IWOTH ? 1 : 0;
        fill[2] = mode & S_IXOTH ? 1 : 0;
    }
}
Другие вопросы по тегам