Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Задачи с Java web start при обновлении до j7u45

Anna | 3.06.2014 | нет комментариев
Как дозволено додуматься из наименования, пост будет посвящен вышедшему security обновлению джавы, которое наверно сломает/сломало запуск вебстартового приложения. Всех не безразличных — умоляю под кат.

В нашей компании принята практика обновлять Java на всех серверах, как только выходят новые версии. Собственно, так мы и поступили в данный раз. Но что-то вульгарно не так, веб старт заказчик перестал запускаться и приложение, без объявления войны, стало легко закрываться.
Засучив рукава, предстояло разобраться, что же стало поводом такого поведения.

Запустив заказчик локально, возникли ранее неизвестные предупреждения о том, что в файлах манифеста отсутствуют свойства: Permissions, Application-Name, Codebase. Немножко почитав о них, в качестве пробы было решено добавить их на дурачка во все манифесты, приблизительно в дальнейшим виде:

  Permissions: all-permissions
  Application-Name: AppName
  Codebase: *

Не слишком прекрасно, от предупреждений избавило, но задачу не решило.
Дальше, в ходе длинных дебагов (спасибо тебе Eclipse RCP за радостное детство) было подмечено, что системные параметры передаются как-то не так, что вывело на дальнейший пост на stackoverflow:stackoverflow.com/questions/19400725/with-java-update-7-45-the-system-properties-no-more-set-from-jnlp-tag-property.
Резюмируя его, дозволено сказать, что сейчас невозможно легко так взять и передать проперти в JNLP файле.

Было обнаружено 3 пути решения:
1) Подписать JNLP файл — docs.oracle.com/javase/7/docs/technotes/guides/jweb/signedJNLP.html#signedJnlp — лаконично — легко подложить jnlp в подписанный джарик в папку JNLP-INF с именем APPLICATION.JNLP и будет блаженство.
Основная задача в этом методе заключалась в том, что у нас JNLP для всякого заказчика различный и вообще говоря генерится на лету.

2) Сделать подписанный образец JNLP файла — blogs.oracle.com/thejavatutorials/entry/signing_jar_files_with_a
Первоначально я остановился на этом методе, ничего трудного: тоже самое, что и в предыдущим пункте, только имя файла APPLICATION_TEMPLATE.JNLP и те места, что могут изменятся заменяем на ‘*’.
Но все оказалось не так светло, ничего не заработало. Пришлось немножко по шаманить и влезть во внутренности веб старта, Дабы посмотреть как же сравнивается образец и сам jnlp файл. В выводе был найден дальнейший код в com.sun.javaws.jnl.XMLFormat:

  public static boolean isBlacklisted(XMLNode paramXMLNode)
  {
    if (paramXMLNode == null) {
      return false;
    }
    if (paramXMLNode.getName() != null)
    {
      XMLAttribute localXMLAttribute;
      String str;
      if ((paramXMLNode.getName().equals("java")) || (paramXMLNode.getName().equals("j2se"))) {
        for (localXMLAttribute = paramXMLNode.getAttributes(); localXMLAttribute != null; localXMLAttribute = localXMLAttribute.getNext()) {
          if (localXMLAttribute.getName().equals("java-vm-args"))
          {
            str = localXMLAttribute.getValue();
            if ((str != null) && (str.indexOf("*") >= 0))
            {
              Trace.println("Blacklisted - a = "   localXMLAttribute, TraceLevel.SECURITY);
              return true;
            }
          }
        }
      } else if (paramXMLNode.getName().equals("property")) {
        for (localXMLAttribute = paramXMLNode.getAttributes(); localXMLAttribute != null; localXMLAttribute = localXMLAttribute.getNext())
        {
          str = localXMLAttribute.getValue();
          if ((str != null) && (str.indexOf("*") >= 0))
          {
            Trace.println("Blacklisted - a = "   localXMLAttribute, TraceLevel.SECURITY);
            return true;
          }
        }
      }
    }
    if (isBlacklisted(paramXMLNode.getNested())) {
      return true;
    }
    return isBlacklisted(paramXMLNode.getNext());
  }

Проверяет приблизительно следующее: при сопоставлении образца с файлом, глядит не находится ли нынешний тег в черном списке, если да, то не пропускает такой jnlp файл. В нынешней реализации невозможно добавлять образцы в качество java-vm-args тэгов java либо j2se, а так же невозможно передавать параметры, содержащие в значение образец.

И вновь провал, многие свойства для всякого заказчика уникальны и передаются как раз через параметры в виде:

<property 
  name="client.specific.property"
  value="client.specific.value"/>

И мы не можем легко написать в образце:

<property 
  name="client.specific.property"
  value="*"/>

Остается только конечный(на тот момент) вариант:

3) В соответствии с bugs.openjdk.java.net/browse/JDK-8023821, свойства дозволено передавать, добавив к ним префикс ‘jnlp’, они будут удачно перекладываться в системные свойства и дальше в нашем коде дозволено будет переложить их на свое место. От того что иной альтернативы не было обнаружено, в самое предисловие запуска приложения был добавлен код, найденый тут:

  private static void initializeSystemProperiesFromJnlp() {
    //Hack for not signing JNLP file
    Properties properties = System.getProperties();
    // copy properties to avoid ConcurrentModificationException
    Properties copiedProperties = new Properties();
    copiedProperties.putAll(properties);
    Set<Object> keys = copiedProperties.keySet();
    for (Object key : keys) {
      if (key instanceof String) {
        String keyString = (String) key;
        if (keyString.startsWith("jnlp.")) { //$NON-NLS-1$
          // re set all properties starting with the jnlp-prefix 
          // and set them without the prefix
          String property = System.getProperty(keyString);
          String replacedKeyString = keyString.replaceFirst("jnlp.", ""); //$NON-NLS-1$ //$NON-NLS-2$

          System.setProperty(replacedKeyString, property);
        }
      }
    }
  }

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

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

Верю данный пост будет кому-нибудь пригоден.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB