подписанный апплет Java вызывает AccessControlException при записи файлов в локальную систему

У меня есть Java-апплет с цифровой подписью.
Мне нужно иметь возможность вызывать функцию из javascript, которая записывает xml-файл в пользовательскую папку.

У меня есть код в функции инициализации апплета, которая создает подпапку, создает файл и добавляет к этому файлу. Это работает без ошибок. Когда тот же код находится внутри функции (ниже), которая вызывается непосредственно из javascript, возникает исключение управления доступом:

public boolean createLocalXMLFile(String XML) {
    String path = BaseDirectory.baseDirectory + "\\TestFolder";
    try {
        boolean status;
        status = new File(path).mkdir();

        UUID fName = UUID.randomUUID(); 

        FileWriter fstream = new FileWriter(path + "\\"+fName+".xml");
        BufferedWriter out = new BufferedWriter(fstream);
        out.write(XML);
        //Close the output stream
        out.close();

        return true;
    }catch (Exception ex) {
        System.out.println("createXMLError \n"+ex.toString());
        return false;
    }

}

* обратите внимание, что базовый каталог относится к домашнему пути пользователя

Ошибка консоли Java java.security.AccessControlException: доступ запрещен (запись java.io.FilePermission C:\Users\Richard\Hytec\AppStore\0d927ab7-74ba-449a-9db4-98e62cd0f53b.txt)


person R Davies    schedule 12.07.2011    source источник


Ответы (2)


Если вы вызываете методы своего апплета из JavaScript, результирующие разрешения представляют собой пересечение разрешений вашего апплета и разрешений моста JavaScript, что означает в вашем случае отсутствие разрешений на доступ к локальному файлу.

Чтобы запустить код с разрешениями вашего апплета, оберните критический код в AccessController.doPrivileged(...). Конечно, сначала убедитесь, что это не может сделать ничего вредоносного, даже если оно вызвано вредоносным кодом.

person Paŭlo Ebermann    schedule 12.07.2011

Сначала убедитесь, что для вашего файла policy установлены соответствующие разрешения. Вы можете установить его на all-permissions для отладки и убедиться, что это не ваша проблема.

В какой операционной системе у вас возникла эта проблема? У вас такая же проблема с XP? Причина, по которой я спрашиваю, заключается в том, что даже подписанные апплеты с полными разрешениями, предоставленными файлом политики, не имеют полного доступа к файлам на рабочей станции под управлением Windows Vista или Windows 7.

Это связано с концепцией уровней целостности папок, даже когда UAC отключен, http://msdn.microsoft.com/en-us/library/bb625962.aspx

Локальное хранилище апплетов по умолчанию имеет уровень целостности, установленный на Low, что означает, что оно по своей сути не является доверенным, и процессы, запущенные из этих каталогов, могут иметь полные разрешения только для файлов и процессов, работающих в других каталогах целостности Low. Системные папки имеют целостность High, а другие папки по умолчанию имеют целостность Medium.

К счастью, все это можно изменить, и есть бесплатный инструмент командной строки, который может помочь вам изменить уровень целостности папок без использования административных инструментов панели управления. http://www.minasi.com/apps/

Надеюсь, это все поможет.

person maple_shaft    schedule 12.07.2011
comment
Спасибо за ответ, хотя подписанный апплет может выполнять те же операции из функции инициализации. Я использую win 7, ie9 и пробовал chrome и xp с тем же ответом. Обновление файла политики не подходит для сред, в которых будет использоваться приложение. - person R Davies; 12.07.2011
comment
Мне кажется странным, что у вас есть права в функции init(), но больше нигде. В этой ветке описывается ваша ужасная ситуация с файлом политики и Java-апплетами, velocityreviews.com/forums/ - person maple_shaft; 12.07.2011
comment
Предполагая, что вы говорите правильно, можете ли вы создать поток, который просыпается каждые 5 секунд в методе init и проверяет глобальную логическую переменную для выполнения какой-либо операции ввода-вывода файла? Я знаю, это звучит как хак, но это может сработать. - person maple_shaft; 12.07.2011
comment
Спасибо, я подумал об этом взломе и, к сожалению, это может быть мой единственный вариант. Я не понимаю, почему один и тот же код работает в функции init(), единственное, о чем я могу думать, это то, что код, выполняемый другим процессом (JavaScript), является причиной нарушения безопасности. - person R Davies; 12.07.2011