Попытка завести Adium для работы с IServerD или патчим Adium
С закрытием ICQ захотелось ностальгии, и был найден проект KICQ. Раскатили у себя IServerD, немного подрихтовали, запилили регистрацию, и вот решила заюзать через QIP 2005 — понравилось! Но моим основным рабочим устройством является мак, потому решено было попытать удачу с Adium!
Старые клиенты скомпилированы под 32 bit и со старой версией SDK.
Окей, попытка перекомпилить старую версию под 14.5. Успехом это не увенчалось.
Окей, попытка скомпилить последний adium с отключённым use_clientlogin — провал.
В процессе изучения проекта нашлась злосчастная строчка, которая всё испортила:
purple_account_set_bool(account, "use_clientlogin", TRUE);
То есть use_clientlogin в конфига libpurple просто игнорится.
Попытка пропатчить бинарь также потерпела крах — было лень разбираться, видать компилятор оптимизирует и разносит вызовы и константы, потому не получилось локализовать место вызова.
Полистав код нашла такой кусок:
if ((purple_proxy_info_get_type(proxy_info) != PURPLE_PROXY_NONE) &&
purple_proxy_info_get_host(proxy_info) && strlen(purple_proxy_info_get_host(proxy_info))) {
/* Proxy servers and client login don't currently get along. This should be fixed in libpurple, but until then,
* just don't use it, unless the hidden preference is set.
*/
purple_account_set_bool(account, "use_clientlogin", [[NSUserDefaults standardUserDefaults] boolForKey:@"AIUseClientLoginWithProxies"]);
}
То есть, если включить прокси и указать хост, то в use_clientlogin проставится NO, поскольку AIUseClientLoginWithProxies нигде не указан.
Так и делаем: выбор пал на squidman.
Ставим, в настройках в template добавляем в Access Control list строчку:
acl port 5190
Прописываем http прокси в adium, страдаем и подключаемся!
Полагаю, с какой-то версии протокола стала возможна поддержка форматирования сообщений, а может это делается в зависимости от клиента (странно конечно)
Пока не юзабельно! Нет логов того, что происходит на сервере, почему он нас выбрасывает.
UPD: Вышло пропатчить клиент для отключения хардкода на use_clientlogin == TRUE
Достаточно пропатчить AdiumLibPurple
48 8D 35 1E 1E 03 00 4A 8B 3C 23 BA 01 00 00 00 -> 48 8D 35 1E 1E 03 00 4A 8B 3C 23 BA 00 00 00 00
По факту приводим код:
op[43487] lea rsi, [rip + 0x31e1e] 27DE1h 7h Opcode Fg: Bg:
op[43488] mov rdi, qword ptr [rbx + r12] 27DE8h 4h Opcode Fg: Bg:
op[43489] mov edx, 1 27DECh 5h Opcode Fg: Bg:
К виду
op[43487] lea rsi, [rip + 0x31e1e] 27DE1h 7h Opcode Fg: Bg:
op[43488] mov rdi, qword ptr [rbx + r12] 27DE8h 4h Opcode Fg: Bg:
op[43489] mov edx, 0 27DECh 5h Opcode Fg: Bg:
Где mov edx, 0 это помещение 0 в регистр edx, который используется при дальшейшем вызове purple_account_set_bool, который находится на строчку ниже:
op[43490] call 0x224f7 27DF1h 5h Opcode Fg: Bg:
Отвал подключения также присутствует. Иногда также ругается:
Unable to add the buddy 1 because you have too many buddies in your buddy list. Please remove one and try again.
Используемая версия libpurple определяет код ack 0x000c как ошибку переполнения контакт-листа. Сделала патченую версию чтобы она не мешала, она ниже.
В целом были мысли переписать IServerD на Java, всё распилить по микросервисам, завернуть в докер да кафку накинуть, пока думаю.
А на этом всё 🥰