Попытка завести Adium для работы с IServerD или патчим Adium

С закрытием ICQ захотелось ностальгии, и был найден проект KICQ. Раскатили у себя IServerD, немного подрихтовали, запилили регистрацию, и вот решила заюзать через QIP 2005 — понравилось! Но моим основным рабочим устройством является мак, потому решено было попытать удачу с Adium!

Попытка завести Adium для работы с IServerD или патчим 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, всё распилить по микросервисам, завернуть в докер да кафку накинуть, пока думаю.

А на этом всё 🥰