Подписанный Java-апплет не получает разрешений в Safari - PullRequest
1 голос
/ 31 июля 2009

У меня есть подписанный Java-апплет (использующий самоподписанный сертификат), который должен получить доступ к файловой системе пользователя. Я должен сделать это, поэтому, пожалуйста, не отвечайте ала "Вы не должны делать это":)

Дело в том, что, когда я запускаю апплет из Firefox 3.0 / Mac, все работает как нужно, я получаю весь доступ так, как должен.

Когда я использую Safar 4 / Mac, я не получаю доступ. Строка, с которой у меня особенно проблемы, - это System.getProperty () (хотя, когда я заглушаю это, доступ к FS тоже не работает)

String home = System.getProperty("user.home");

Исключение, которое я получаю, следующее:

java.security.AccessControlException: access denied (java.util.PropertyPermission user.home read)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264)
at java.security.AccessController.checkPermission(AccessController.java:427)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1285)
at java.lang.System.getProperty(System.java:628)
at de.samedi.searcher.Searcher.<init>(Searcher.java:49)
at de.samedi.searcher.Applet.getSearcher(Applet.java:193)
at de.samedi.searcher.Applet.getSearcher(Applet.java:187)
at de.samedi.searcher.Applet.addPatient(Applet.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at sun.plugin.javascript.invoke.JSInvoke.invoke(JSInvoke.java:19)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at sun.plugin.javascript.JSClassLoader.invoke(JSClassLoader.java:44)
at sun.plugin.liveconnect.PrivilegedCallMethodAction.run(SecureInvocation.java:658)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.liveconnect.SecureInvocation$2.run(SecureInvocation.java:214)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.liveconnect.SecureInvocation.CallMethod(SecureInvocation.java:192)
at sun.plugin.liveconnect.SecureInvocation.access$300(SecureInvocation.java:52)
at sun.plugin.liveconnect.SecureInvocation$CallMethodThread.run(SecureInvocation.java:123)

Как я уже сказал, это отлично работает в Firefox. Должен проверить браузер Windows сегодня ...

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 01 августа 2009

После того как ваш jar скомпилирован и подписан, вы должны запустить опцию -verify, чтобы убедиться, что он подписан правильно.

Если проверка в порядке, посмотрите установленные сертификаты в ваших браузерах. Я ничего не делал в Safari, только IE, но я думаю, что есть место, похожее на I.E. где вы можете хотя бы просмотреть установленные сертификаты. Я хотел бы убедиться, что сертификат установлен.

Также убедитесь, что ваш код выполняется в привилегированном блоке.

 String home = System.getProperty("user.home");

всегда выдаст ошибку в 1.4 или выше. Если вы не редактировали файл java.policy для всех разрешений

Попробуйте использовать это в сочетании с вашей подписанной банкой.

 String home = (String) AccessController.doPrivileged(new PrivilegedAction() 
 {
      public Object run() 
      {
     return System.getProperty("user.home");
      }
 });
0 голосов
/ 31 июля 2009

Я помню, что у меня была похожая проблема в старой версии Safari (это было много лет назад), и я нашел решение, добавив задержку в апплет. Казалось, что Safari по какой-то причине разрешал апплету запускаться до того, как пользователю был дан диалог «доверять этому апплету» (другие браузеры не запускали апплет до тех пор, пока пользователь не предоставил или не запретил доступ). В этот момент апплет не был доверенным, и возникнет исключение безопасности. Даже если пользователь тогда разрешит доверие, было уже слишком поздно, так как апплет уже запустился и вышел из строя. Мне пришлось добавить задержку для safari, чтобы он не пытался делать что-либо, для чего требовался безопасный доступ, до тех пор, пока не прошло какое-то время, позволяя пользователю предоставить доступ до того, как апплет попытается сделать что-либо, требующее безопасного доступа.

0 голосов
/ 31 июля 2009

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

...