Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите Плагин аутентификации для BungeeCord

Тема в разделе "Разработка плагинов для новичков", создана пользователем Reality_SC, 12 май 2016.

  1. Автор темы
    Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Я очень сильно не помню, создавал ли я такую тему или нет, скорее всего просто где-то невнятно спросил в чужой с год назад и всё.

    Мне нужно написать drag-and-drop плагин для BungeeCord. Плагин должен модифицировать рантайм так, чтобы при подключении игрока к прокси вот в этих вызовах:
    Код:
    String authURL
       = "https://sessionserver.mojang.com/session/minecraft/hasJoined?username="
       + encName + "&serverId=" + encodedHash;
    заменялась часть URL на мою. Без модификации исходного кода или .jar-файла самого BungeeCord-а!

    Что у меня уже есть? Пустая заготовка плагина, и небольшая хакалка, которая использует рефлексию и подмену URLStreamHandler для других задач (подмена ссылок в клиентах и на серверах), но не может решить данную проблему с BungeeCord-ом.

    Можно не писать код, а на словах объяснить принцип что и как сделать.
    Я умею писать код и заменить часть строки я умею сам, я не могу найти точку входа так, чтобы интегрировать свой код в это место.
    P.S. Я практически не знаю, как внутри устроены реализации URL и т.п.

    @Dereku @Shevchik @alexandrage
     
  2. Хостинг MineCraft
    <
  3. fall.us

    fall.us Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    fallus
    Если Вы сможете получить доступ к объекту с данной строкой(сам я не пробовал), то сможете с легкостью изменить в нем значение любого поля, используя рефлексию.
     
    Последнее редактирование: 12 май 2016
  4. Larin

    Larin Старожил Пользователь

    Баллы:
    103
  5. Автор темы
    Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    В том-то и проблема, что это не поле объекта, а константа в теле метода, и рефлексией до неё не добраться.[DOUBLEPOST=1463055740,1463055466][/DOUBLEPOST]
    Всё-таки склоняюсь к тому, что сделать что-то можно.
    P.S. Вот иерархия ClassLoader-ов, которые видит запускаемый плагин:
    upload_2016-5-12_18-22-1.png
    Первые два системные, последний кастомный.
     
  6. Larin

    Larin Старожил Пользователь

    Баллы:
    103
    Есть 1 способ - плагин-редактор InitialHandler, который редактирует код класса в архиве во время запуска, но я не знаю, можно ли редактировать классы в jar файле запущенной программы.[DOUBLEPOST=1463056170][/DOUBLEPOST]
    Попробуй: http://asm.ow2.org/
    На русском: https://www.ibm.com/developerworks/ru/library/l-jvmbytecode_mdf_1/
     
  7. fall.us

    fall.us Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    fallus
    Поддерживаю @Larin. Кроме как изменения кода класса, Вы никак не сможете изменить значение локальной переменной, ибо переменная не существует, пока метод не будет вызван.
     
  8. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Легко, javaassist or asm. А простой рефлексией тут делать нечего. Хотя на счет asm не уверен, он вроде патчит класс до загрузки, но не после.[DOUBLEPOST=1463057569,1463056845][/DOUBLEPOST]Хотя, можно попробовать реализовать псевтоонлайнмод на плагине при офлайн моде банжы, используя продление класса и overide. Или полностью на своей либе.
     
    Последнее редактирование: 12 май 2016
  9. Larin

    Larin Старожил Пользователь

    Баллы:
    103
    Продлить не выйдет, там в других классах используется конструктор этого класса, а что там происходит - фиг его знает. Лучше сразу запатчить 1 раз и всё.

    Имхо: если надо быстро - javassist.
     
  10. Автор темы
    Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Никогда не юзал ни asm, ни javaassist.. Оно сложно?
    Если я правильно понял, мне нужно организовать пролог для InitialHandler::handle(final EncryptionResponse encryptResponse), или прокси метод...
    Примеры где-то искать, на стеке, да?)) у вас под рукой нету?
     
  11. Larin

    Larin Старожил Пользователь

    Баллы:
    103
    https://rawgit.com/jboss-javassist/javassist/master/tutorial/tutorial.html

    2 пути:
    1. Свой classloader + javassist для изменения кода(Подмена класса во время загрузки)
    2. Javassist + включенный дебаггер java при запуске(не рекомендую)(Подмена class файла своппером)
     
  12. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Лол, зачем целый класс подменять. Или ты не вкурсе на что способен javassist.
    И класслоадер тут совсем не в тему.
     
  13. Автор темы
    Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Можно какие-нибудь примеры и то, как ты себе это представляешь? незнакомые слова нагуглю :)
     
  14. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Короче жабаассист способен менять начинку в классе. за исключением rt.jar и прочих жабобиблиотек.
     
  15. Автор темы
    Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Я правильно понял, что и javaassist, и asm требуют, чтобы класс ещё не был загружен?
    В общем, наверное, это допустимо, если никакие другие классы не тянут загрузку класса InitialHandler при своей инициализации, и игроки ещё не начинают ломиться до окончания загрузки плагинов...
     
    Последнее редактирование: 13 май 2016
  16. Larin

    Larin Старожил Пользователь

    Баллы:
    103
    Да, javassist - эдакий classloader. После загрузки тоже можно, но для этого нужно включить дебагер java во время пуска.
     
  17. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
  18. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    76
    Больно уж интересная тема. ТС, не мог бы рассказать о результатах, если таковые имеются?
     
  19. Автор темы
    Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Пока результаты не имеются, я отвлекаюсь на миллион разных дел одновременно.
    Как будет — расскажу.
     

Поделиться этой страницей