Установка и активация JIRA Software Server 7.5.0

Oct 9, 2017 17:30 · 704 words · 4 minute read docker jira

Однажды мне стало интересно посмотреть, как устроена защита в одном из самых известных и популярных инструментов для разработчиков — JIRA Software.

ВНИМАНИЕ! Информация в статье доступна только в образовательных целях, НЕ ИСПОЛЬЗУЙТЕ ее для получения несанкционированного доступа к рассматриваемому ПО!

Для «лицензирования» JIRA Software Server 7.5.0 необходимо внести изменения в два файла (приведены актуальные версии файлов на момент установки): atlassian-extras-3.2.jar и atlassian-universal-plugin-manager-plugin-2.22.5.jar.

В стандартной установке на Linux файлы находятся в каталогах /opt/atlassian/jira/atlassian-jira/WEB-INF/lib/ и /opt/atlassian/jira/atlassian-jira/WEB-INF/atlassian-bundled-plugins/ соответственно.

Скачиваем файлы на локальный компьютер, устанавливаем инструмент JD-GUI. Далее:

  • открываем atlassian-extras-3.2.jar с помощью декомпилятора JD-GUI;
  • жмем “File -> Save All Sources” или Ctrl+Alt+S (сохранится архив atlassian-extras-3.2.jar.src.zip);
  • распаковываем полученный архив с помощью архиватора;
  • в atlassian-extras-3.2.jar.src/com/atlassian/extras/decoder/v2/Version2LicenseDecoder.java находим метод loadLicenseConfiguration (в моем случае выглядел так):
/*     */   private Properties loadLicenseConfiguration(Reader text)
/*     */   {
/*     */     try
/*     */     {
/* 218 */       Properties props = new Properties();
/* 219 */       new DefaultPropertiesPersister().load(props, text);
/* 220 */       return props;
/*     */     }
/*     */     catch (IOException e)
/*     */     {
/* 224 */       throw new LicenseException("Could NOT load properties from reader", e);
/*     */     }
/*     */   }

и добавляем в данный метод информацию о лицензии:

/*     */   private Properties loadLicenseConfiguration(Reader text)
/*     */   {
/*     */     try
/*     */     {
/* 218 */       Properties props = new Properties();
/* 219 */       new DefaultPropertiesPersister().load(props, text);
 
                props.setProperty("LicenseExpiryDate", "2099-01-01");
                props.setProperty("MaintenanceExpiryDate", "2099-01-01");
                props.setProperty("Evaluation", "false");
                props.setProperty("NumberOfUsers", "-1");
                props.setProperty("Organisation", "MyCorp");
                props.setProperty("PurchaseDate", "2017-01-01");
                props.setProperty("SEN", "SEN-L10306231");
 
/* 220 */       return props;
/*     */     }
/*     */     catch (IOException e)
/*     */     {
/* 224 */       throw new LicenseException("Could NOT load properties from reader", e);
/*     */     }
/*     */   }
  • сохраняем файл;
  • копируем commons-codec-1.9.jar в директорию с исходниками (atlassian-extras-3.2.jar.src);
  • переходим в каталог с исходниками (atlassian-extras-3.2.jar.src) и компилируем класс из java-файла, который мы правили командой:
javac -cp commons-codec-1.9.jar -sourcepath ./ com/atlassian/extras/decoder/v2/Version2LicenseDecoder.java 
  • могут быть ошибки (вызваны “кривостью” декомпиляции исходников), например:
./com/atlassian/extras/common/LicenseException.java:7: error: class, interface, or enum expected
/*    */  * @deprecated
          ^
./com/atlassian/extras/common/LicenseException.java:8: error: class, interface, or enum expected
/*    */  */
          ^
./com/atlassian/extras/common/org/springframework/util/StringUtils.java:101: error: variable strLen is already defined in method hasText(String)
/*     */     int strLen;
                  ^
./com/atlassian/extras/common/org/springframework/util/StringUtils.java:486: error: variable strLen is already defined in method changeFirstCharacterCase(boolean,String)
/*     */     int strLen;
                  ^
Note: ./com/atlassian/extras/common/org/springframework/util/StringUtils.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
  • устраняем ошибки и еще раз компилируем класс. После успешного выполнения в каталоге com/atlassian/extras/decoder/v2/ появится файл Version2LicenseDecoder.class
  • полученныей файл копируем с заменой (по такому же пути com/atlassian/extras/decoder/v2/) в архив atlassian-extras-3.2.jar (проще всего это сделать через mc — Midnight Commander);
  • в общем случае “новый” архив atlassian-extras-3.2.jar необходимо положить (с заменой) на сервере с Jira в каталог /opt/atlassian/jira/atlassian-jira/WEB-INF/lib/ и перезапустить Jira. Если вы запускаете JIRA Software Server 7.5.0 в docker-контейнере, то нужно пересобрать docker-образ согласно инструкциям в Dockerfile (см. ниже)

Аналогичным образом патчим файл atlassian-universal-plugin-manager-plugin-2.22.5.jar:

  • открываем atlassian-universal-plugin-manager-plugin-2.22.5.jar с помощью декомпилятора JD-GUI;
  • жмем “File -> Save All Sources” или Ctrl+Alt+S (сохранится архив atlassian-universal-plugin-manager-plugin-2.22.5.jar.src.zip);
  • распаковываем полученный архив с помощью архиватора;
  • в atlassian-universal-plugin-manager-plugin-2.22.5.jar.src/com/atlassian/extras/decoder/v2/Version2LicenseDecoder.java находим метод loadLicenseConfiguration (в моем случае выглядел так):
private Properties loadLicenseConfiguration(Reader text)
{
  try
  {
    Properties props = new Properties();
    new DefaultPropertiesPersister().load(props, text);
    return props;
  }
  catch (IOException e)
  {
    throw new LicenseException("Could NOT load properties from reader", e);
  }
}

и добавляем в данный метод информацию о лицензии:

private Properties loadLicenseConfiguration(Reader text)
{
  try
  {
    Properties props = new Properties();
    new DefaultPropertiesPersister().load(props, text);
    props.setProperty("LicenseExpiryDate", "2099-01-01");
    props.setProperty("MaintenanceExpiryDate", "2099-01-01");
    props.setProperty("Evaluation", "false");
    props.setProperty("NumberOfUsers", "-1");
    return props;
  }
  catch (IOException e)
  {
    throw new LicenseException("Could NOT load properties from reader", e);
  }
}
  • сохраняем файл;
  • копируем commons-codec-1.9.jar в директорию с исходниками (atlassian-universal-plugin-manager-plugin-2.22.5.jar.src);
  • переходим в каталог с исходниками (atlassian-universal-plugin-manager-plugin-2.22.5.jar.src) и компилируем класс из java-файла, который мы правили такой командой:
javac -cp commons-codec-1.9.jar -sourcepath ./ com/atlassian/extras/decoder/v2/Version2LicenseDecoder.java
  • могут быть ошибки (вызваны “кривостью” декомпиляции исходников), устраняем их и еще раз компилируем класс. После успешного выполнения в каталоге com/atlassian/extras/decoder/v2/ появится файл Version2LicenseDecoder.class;
  • полученныей файл копируем с заменой (по такому же пути com/atlassian/extras/decoder/v2/) в архив atlassian-universal-plugin-manager-plugin-2.22.5.jar (проще всего это сделать через mc — Midnight Commander);
  • в общем случае “новый” архив atlassian-universal-plugin-manager-plugin-2.22.5.jar необходимо положить (с заменой) на сервере с Jira в каталог /opt/atlassian/jira/atlassian-jira/WEB-INF/atlassian-bundled-plugins/, после чего удалить каталоги ${JIRA_HOME}/plugins/.bundled-plugins и ${JIRA_HOME}/plugins/.bundled-plugins/.osgi-plugins и перезапустить Jira. Если вы запускаете JIRA Software Server 7.5.0 в docker-контейнере, то нужно пересобрать docker-образ согласно инструкциям в Dockerfile

Инструкции по сборке docker-образа (Dockerfile) выглядят так:

FROM cptactionhank/atlassian-jira-software:7.5.0
 
COPY atlassian-universal-plugin-manager-plugin-2.22.5.jar ${JIRA_INSTALL}/atlassian-jira/WEB-INF/atlassian-bundled-plugins/atlassian-universal-plugin-manager-plugin-2.22.5.jar
COPY atlassian-extras-3.2.jar ${JIRA_INSTALL}/atlassian-jira/WEB-INF/lib/atlassian-extras-3.2.jar
 
CMD ["/opt/atlassian/jira/bin/catalina.sh", "run"]
tweet Share