Size: a a a

Wi-Fi в метро

2019 September 12
Wi-Fi в метро
Если кому интересно, то вот так выглядят старая и новая реализации проверки. Старая была сильно проще :)
источник
Wi-Fi в метро
источник
2019 September 13
Wi-Fi в метро
380-я сборка #master, 54-я сборка #webview и 26-я сборка #webview-experimental!

#master, 54-я сборка #webview и 26-я сборка #webview-experimental!

Перенёс часть измений из экспериментальной ветки в #master и #webview:

1. Переход на compile SDK 28, обновление системы сборки, совместимость проекта с Eclipse и VSCode. Target SDK по-прежнему остаётся на 25, так как даже 26-я версия полностью ломает WebView в фоновом режиме;

2. Ручное подключение больше не будет прерываться, если свернуть или закрыть окно приложения. Теперь этот процесс защищается временным уведомлением, как это происходит и с автоматическим фоновым подключением;

3. Последние 100 строк обычного лога и 2000 строк расширенного сохраняются в памяти приложения и восстанавливаются при его открытии. Так что теперь не страшно закрывать приложение — лог всё-равно будет на месте. Очистить его вручную можно кнопкой в окне просмотра;

4. Теперь лог можно посмотреть, не запуская при этом ручное подключение. Для этого можно нажать на уведомление о подключении, воспользоваться пунктом "Посмотреть лог" в главном меню или создать ярлык;

5. Обновлён алгоритм MAInet для сети Московского авиационного института. Теперь в настройках можно указывать логин и пароль для входа в сеть MAInet_public. Раньше это не требовалось, так как логин и пароль у всех были одинаковые. Также теперь этот алгоритм можно выключать, если он вам не нужен. Это ничего особо не изменит, если вы не бываете в МАИ, но подозреваю, что многим так спокойнее;



Изменения в #webview:

1. В разы уменьшен размер лога подключения. Теперь вместо HTML кода мутировавших элементов в лог выводятся только их CSS-селекторы;



Изменения в #webview-experimental:

1. Обновление до 54-й сборки #webview;
2. Уменьшен спам из функции generate_204;



Ближайшие планы:

master и webview:
1. Есть сообщения о проблемах с получением CSRF токена. Пока разбираюсь;
2. Убрать fallback на MosMetroV3 в случае, когда generate_204 вернул пустой ответ. Это практически не работает, надёжнее просто прекращать подключение;
3. Починить вылет на #webview, связанный с попыткой открыть страницу после уничтожения браузера;
4. Рассмотреть возможность слияния #master и #webview, так как одну ветку будет гораздо проще поддерживать;

webview-experimental:
1. Сделать облегчённую версию generate_204 для регулярной проверки после подключения (проверять только по HTTPS);
2. Разобраться с "midsession": собрать дамп (в процессе) или получить подтверждение, что приложение и так справляется;


master — https://mosmetro.duckdns.org/api/v1/download.php?branch=master
webview — https://mosmetro.duckdns.org/api/v1/download.php?branch=webview
webview-experimental — https://mosmetro.duckdns.org/api/v1/download.php?branch=webview-experimental
источник
2019 September 14
Wi-Fi в метро
29-я сборка #webview-experimental!#webview-experimental! (две пропущены)

* Теперь алгоритмы MosMetroV2 и MosMetroV2WV не требуют для работы CSRF-токен. Точнее токен всё ещё нужен, но приложение не будет прерывать работу, если его вдруг не будет. Это должно помочь с теми случаями, когда страница авторизации возвращает перенаправление на саму себя;

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

* Перевёл фреймворк сбора отчётов о вылетах (ACRA) на новый бэкенд Tracepot. HockeyApp закрывается в ближайшие месяцы, а предложенная альтернатива (AppCenter) не совместима с приложением. Новая система должна работать точнее и не путать отчёты с разных версий приложения (я криво реализовал);

* В качестве эксперимента добавил отслеживание ошибок generate_204 с помощью ACRA. Теперь приложение само отправит мне лог в случае аномалий, чтобы ускорить исследование сети. Важно: эта функция никогда не выйдет из тестовой ветки, т.к. я всё-равно физически не смогу разобрать все отчёты, если она попадёт в релиз :)

* MosMetroV2WV: Заблокировал домен spb.wi-fi.ru по аналогии с wi-fi.ru, так как эта страница не несёт для нас никакой пользы, но при этом весит почти как всё приложение. Cам запрос всё-равно отправляется, приложение просто игнорирует ответ;

* Удалена тестовая опция pref_trust_all_certs, отключающая проверку сертификатов. Она ломает новую реализация проверки generate_204, второй этап который полностью полагается на невозможность подмены ответа от надёжного сервера;


APK: https://mosmetro.duckdns.org/api/v1/download.php?branch=webview-experimental
источник
2019 September 15
Wi-Fi в метро
31-я сборка #webview-experimental!#webview-experimental! (опять одну пропустил)

* Починил ACRA на релизных сборках. Опять ProGuard лишнего наудалял, из-за чего информация о версии приложения была неправильной;

* HTTP-клиент теперь не будет пытаться делать новые запросы, если выполнение алгоритма прервано пользователем или системой;

* HTTP-клиент теперь не будет повторять попытку отправки запроса, если предыдущий завершился с ошибкой SSL (нет смысла ломиться на тот же сервер);

* Улучшен механизм задержек. Теперь приложение должно почти моментально завершаться при нажатии на кнопку "Остановить". Оказалось, что в некоторых местах были 5-секундные непрерываемые задержки, из-за чего казалось, что приложение не отвечает. Однако это не поможет с зависаниями по вине HTTP-клиента (даже не знаю, что с ним можно сделать без диких костылей и утечек памяти);

* Обновлено отслеживание ошибок в generate_204. Надеюсь поймать ложное перенаправление без необходимости бегать и собирать дампы;


APK: https://mosmetro.duckdns.org/api/v1/download.php?branch=webview-experimental
источник
2019 September 16
Wi-Fi в метро
381-я сборка #master, 55-я сборка #webview и 32-я сборка #webview-experimental!

#master, 55-я сборка #webview и 32-я сборка #webview-experimental!

Все ветки (часть списка перенесена из webview-experimental):

* Фреймворк сбора отчётов о вылетах (ACRA) переведён на новый бэкенд Tracepot. HockeyApp закрывается в ближайшие месяцы, а предложенная альтернатива (AppCenter) не совместима с приложением. Новая система должна работать точнее и не путать отчёты с разных версий приложения;

* Теперь алгоритм MosMetroV2 не требует для работы CSRF-токен. Точнее токен всё ещё нужен, но приложение не будет прерывать работу, если его вдруг не будет. Это должно помочь с теми случаями, когда страница авторизации возвращает перенаправление на саму себя;

* Улучшен механизм экстренной остановки алгоритма системой или пользователем (кнопка "Остановить"):
 * HTTP-клиент больше не будет делать новые запросы в случае прерывания. В предыдущих версиях прерывался только текущий запрос, но за ним могли последовать другие;
 * Найдено несколько мест с долгим непрерываемым ожиданием (например, между попытками подключения). Вместо них теперь используется прерываемое ожидание с разрешением 100мс;

* Улучшения лога:
 * В лог добавлены отдельные временные метки для всего фонового процесса (>>>) и для отдельных запусков каждого алгоритма (>>);
 * В случае повторных попыток подключения в лог выводится текст соответствующих уведомлений (сколько попыток сделано и сколько осталось);
 * При каждом запуске приложения лог разделяется меткой ----[ cut here ]---- для автоматической обрезки при отправке отчётов через ACRA;

Ветка webview:

* MosMetroV2WV теперь тоже игнорирует отсутствие CSRF-токена;

* Заблокирована загрузка сайта spb.wi-fi.ru по аналогии с wi-fi.ru. Эта страница не несёт для нас никакой пользы, но при этом весит почти как всё приложение. Cам запрос всё-равно отправляется, приложение просто игнорирует ответ;

* Исправлен вылет при повторных попытках поключения с использованием алгоритмов, основанных на WebView. Это самый массовый и продолжительный баг в истории проекта. По данным HockeyApp, за последний год было как минимум 34 тысячи вылетов только из-за этой проблемы! Не знаю, почему до этого его не получалось исправить =\

Ветка webview-experimental:

* Отключил отслеживание ошибок generate_204 с помощью ACRA. Пока что думаю, как реализовать проверку, которая соберёт лог всего подключения после одного ложно-отрицательного перенаправления;


master — https://mosmetro.duckdns.org/api/v1/download.php?branch=master
webview — https://mosmetro.duckdns.org/api/v1/download.php?branch=webview
webview-experimental — https://mosmetro.duckdns.org/api/v1/download.php?branch=webview-experimental
источник
2019 September 17
Wi-Fi в метро
56-я сборка #webview и 33-я сборка webview-experimental!

#webview и 33-я сборка webview-experimental!

обе ветки:

* Процесс WebView теперь останавливается синхронно, не допуская наложений различных попыток друг на друга. В предыдущей сборке я заблокировал адрес spb.wi-fi.ru, но страница всё-равно просачивалась в лог в конце подключения. Дело в том, что приложение выключало перехват и подмену запросов ещё до того, как WebView завершится полностью;

webview-experimental:

* Исправлена ошибка в DNS-клиенте, которая не давала одновременно использовать несколько серверов. Как оказалось, клиент, о котором сообщалось в логе, уничтожался сразу после этого, а вместо него создавался простой, расчитанный только на один адрес. Надеюсь, что это исправит ошибки DNS.  В противном случае придётся перестраховываться, добывая адреса серверов из DHCP (и то не факт, что поможет);

* Снова добавлен сбор данных в методе generate_204. На этот раз приложение сначала доведёт подключение до конца, а уже потом отправит отчёт о ложно-отрицательном ответе. Таким образом я смогу увидеть, как приложение реагирует на такое ложное перенаправление. При этом в логе будет вся необходимая информация, чтобы доработать алгоритм в случае ошибки;


P.S. Кстати, в ACRA наступила тишина. За вчерашний день вылетела только сборка master, и то из-за бага в прошивке MEIZU (Android 6.0). Вот теперь думаю: всё хорошо или я отправку отчётов поломал? 🤔

P.P.S. Опять ночной релиз... Поэтому сообщение публикую с тихими уведомлениями :)


webview — https://mosmetro.duckdns.org/api/v1/download.php?branch=webview
webview-experimental — https://mosmetro.duckdns.org/api/v1/download.php?branch=webview-experimental
источник
2019 September 18
Wi-Fi в метро
Тест в последней сборке webview-experimental показал, что после ложно-отрицательного ответа generate_204 приложение успешно отрабатывает в 95% случаев! Сам сегодня протестировал этот метод с WebView и без — во всех случаях восклицательный знак у иконки Wi-Fi пропал спустя несколько секунд. Для приложения это всё выглядит, как новое обычное подключение.
источник
Wi-Fi в метро
Во всех трёх случаях с ошибками подключение прервалось из-за отключения Wi-Fi. Были сообщения, что Android иногда сам отключается при появлении восклицательного знака. Если у вас та же проблема, то может помочь опция "Переподключение к Wi-Fi" в настройках подключения.

В оставшихся 4-х случаях повторная проверка по каким-то причинам провалилась (в 3-х случаях из-за таймаутов). В следующей сборке я включу повторные попытки в методе generate_204, чтобы свести такие ошибки к минимуму.
источник
Wi-Fi в метро
34-я сборка #webview-experimental!#webview-experimental!

TL/DR: Немного улучшил generate_204, добавил больше источников для DNS-клиента, отключил отслеживание generate_204 через ACRA.

* generate_204 больше не воспринимает неправильные ответы по HTTPS как что-то непоправимое. Это мешало использовать mitmproxy, т.к. тот не сбрасывает соединение в случае подмены сертификата, а возвращает свою страницу с ошибкой;

* Запросы generate_204 теперь будут повторяться в случае ошибки. Пока что не уверен насчёт этого изменения, т.к. теперь проверка может занимать довольно много времени. Самый худший случай, когда этапы 2 и 3 выкидывают только таймауты, т.е. 5 секунд * 3 попытки * 2 запроса = 30 секунд, чтобы только показать ошибку в конце;

* Теперь в лог пишутся сообщения о ложных ответах generate_204. Например, если вы видите в логе Gen204 (...) | False negative detected, то это значит, что сервер провайдера вернул перенаправление на авторизацию, хотя интернет на самом деле доступен (то, что я называю midsession (не путать с оригинальным midsession у МаксимаТелеком, которого уже нет));

* DNS-клиент теперь пытается получить адреса серверов из DHCP (запрос делает сам Android, новые не отправляются). Эти адреса примешиваются к стандартным, которые нашла библиотека dnsjava (у стандартных приоритет ниже);

* Снова отключено отслеживание ложных ответов в методе generate_204 с помощью ACRA. Метод оказался реально простым и удобным, надо будет применять его в таких ситуациях в будущем;

* Метод generate_204 вынесен в отдельный класс. Планирую сделать кэширование ответов или что-то другое, чтобы при переключении на новый алгоритм запросы не повторялись. Но там надо тщательно всё обдумать, так как проверка используется на 4-х разных уровнях приложения;


webview-experimental — https://mosmetro.duckdns.org/api/v1/download.php?branch=webview-experimental
источник
2019 September 23
Wi-Fi в метро
Актуальные ссылки на сборки приложения

На момент публикации этого поста существуют три основные ветки обновления:


#master#master — основная и самая стабильная ветка, которая быстрее всех получает новые функции и исправления.

* Прямая ссылка на APK
* Архив сборок
* Исходный код


#webview #webview — использует полноценный браузер и JavaScript вместо статичного алгоритма. Работает менее стабильно, однако при этом встречает меньшее сопротивление со стороны провайдеров (практически не ловит блокировки).

* Прямая ссылка на APK
* Архив сборок
* Исходный код


#play#play — совпадает с текущей релизной версией приложения. Эти сборки публиковались в Google Play, пока приложение не было оттуда удалено. По сути это та же ветка #master, только обновляется крайне редко.

* Прямая ссылка на APK
* Архив сборок: Jenkins, GitHub
* Исходный код


Иногда также появляются тестовые ветки, которые можно скачать как через само приложение (изменив ветку в главном меню), так и из Jenkins. Эти ветки обычно существуют недолго и нацелены на отладку новых функций (каких именно — обычно указано в описании ветки).

Важно: все сборки по прямым ссылкам и в Jenkins защищены одной и той же цифровой подписью и чаще всего используют один и тот же код версии, что позволяет свободно и безопасно переключаться между ними.



Не знаете, какую ветку выбрать? Попробуйте начать с #master. Если она будет часто ловить блокировки от провайдера, то можете попробовать переключиться на #webview.

Как менять ветки? Помимо простого скачивания APK по ссылке выше вы можете выбрать ветку обновления в главном меню приложения (пункт "Ветка обновления"). Если в списке отображается только одна сборка, проверьте доступ в интернет и нажмите "Проверить наличие обновлений" в главном меню.

Сборка не устанавливается? Такое может случиться, если текущая установленная сборка имеет другую цифровую подпись (из F-Droid или от неофициальных сборщиков) или более новую версию (даунгрейд не поддерживается в Android). Просто удалите текущую установленную версию и попробуйте снова.

Этот пост будет обновляться до тех пор, пока он не станет неизменяемым, как предыдущий.
источник
Wi-Fi в метро
35-я сборка #webview-experimental!

#webview-experimental!

* Теперь в лог выводится текст изменяющихся элементов, чтобы было возможно хотя бы приблизительно восстановить ход событий в браузере. Не пугайтесь, если в логе вдруг появятся сообщения типа "Вы сегодня ослепительно выглядите!" :)

* Уменьшен объём сообщений об ошибках HTTP-запросов в WebViewService;

* Скрипт авторизации теперь старается игнорировать элементы с классом disabled, так как нажатие на них всё-равно ничего не даст;

* Исправлена работа DNS-клиента во время проверки generate_204;


APK: https://mosmetro.duckdns.org/api/v1/download.php?branch=webview-experimental
источник
2019 September 28
Wi-Fi в метро
Если вы пытались сегодня скачать приложение, но не могли, то теперь должно получиться. Дело в том, что я вчера настраивал OpenVPN и пара правил iptables, как оказалось, конфликтовала с сетью кластера. Из-за этого не работал только Jenkins, поэтому проблемы заметил не сразу.

Проблему только что поправил — она больше не должна повториться. Простите за временные неудобства :)
источник
2020 October 23
Wi-Fi в метро
382-я сборка #master!

#master!

Всем привет! Меня тут вытащили из стазиса, так как в Санкт-Петербурге появился новый алгоритм, с которым приложение оказалось не совместимо. Как выяснилось, новый алгоритм - лишь вариация MosMetroV2 с изменёнными адресами страниц.

Что нового:
* Восстановлена работа приложения в Санкт-Петербурге (но там ещё есть, что доработать);
* Алгоритм MosMetroV3 теперь не будет выбираться, если приложение не смогло получить нормальное перенаправление в самом начале - этот метод уже давно не работает;

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


APK: https://mosmetro.duckdns.org/api/v1/download.php?branch=master
источник
Wi-Fi в метро
383-я сборка #master!

#master!

Пытаюсь разобраться со всеми ветками, которые я успел создать в 2019. Не помню точно, но возможно, что это ещё не всё. Если найду ещё что-нибудь полезное, то сделаю ещё одну сборку :)

Что нового:
* Новая 3-х этапная проверка generate_204. Я писал об этой проверке в... сентябре 2019. Суть в том, что теперь приложение использует более сложную схему проверки, которая должна выдавать более надёжный результат, в том числе замечать midsession и разбираться с ним;
* Добавлена поддержка Private DNS на Android 9+. Раньше приложение не могло подключиться к сети, так как Private DNS не работает без интернета. Теперь приложение игнорирует системный DNS и использует тот, который провайдер выдал через DHCP;

Оба этих изменения всё это время были в ветке webview-experimental, и там они работали достаточно неплохо. Будем надеяться, что это, наконец-то, решит проблему с midsession (восклицательный знак рядом со значком Wi-Fi).


APK: https://mosmetro.duckdns.org/api/v1/download.php?branch=master
источник
Wi-Fi в метро
384-я сборка #master!

#master!

В 382-й сборке я сделал небольшую ошибку, которая во многих случаях ломала подключение с помощью алгоритма MosMetroV2.

Надеюсь, что больше ничего сегодня исправлять не придётся :)


APK: https://mosmetro.duckdns.org/api/v1/download.php?branch=master
источник
Wi-Fi в метро
57-я сборка #webview!

#webview!

* Добавил все изменения из 382-384 сборок #master (см. 3 сообщения выше);

* Попробовал починить MosMetroV2WV в Санкт-Петербурге. У меня пока нет никаких данных о странице авторизации в СПб, так что пришлось действовать наугад. Если не заработает, то к понедельнику подготовлю нормальный план :)

Ветка webview-experimental теперь ничем не отличается от webview, поэтому она будет удалена, как только я ещё раз всё проверю. После удаления webview-experimental сама предложит обновиться до webview.


APK: https://mosmetro.duckdns.org/api/v1/download.php?branch=webview

На случай, если я что-то сломал, вот 56-я сборка: https://jenkins.thedrhax.pw/job/mosmetro-android-pipeline/job/webview/56/artifact/SignApksBuilder-out/android-keystore/pw.thedrhax.*/MosMetro-webview-v71-b56-unsigned.apk/MosMetro-webview-v71-b56.apk (ссылка не откроется из метро без Private DNS или VPN)
источник
2020 October 27
Wi-Fi в метро
58-я сборка #webview!

#webview!

Всё ещё пытаюсь починить алгоритм MosMetroV2WV в Санкт-Петербурге.

* Теперь скрипт автоматизации встраивается на правильной странице. Как оказалось, я перепутал адреса во время первого анализа нового алгоритма, и на самом деле всё действие происходило не на той странице, которую ожидало приложение. В MosMetroV2 сейчас тоже есть эта ошибка, но она там не мешает, поэтому пока не спешу её исправлять;

* Добавлены новые CSS-селекторы для кнопок. В СПб дизайн страницы немного отличается, поэтому приложение могло нажимать не на те кнопки (в том числе на "Отключить рекламу"). Так что даже хорошо, что я в первой сборке адреса перепутал :)

Перед проверкой новой сборки убедитесь, что в настройках включён алгоритм MosMetroV2WV - все изменения здесь относятся именно к нему. Если же он всё-таки не заработает, то можно его отключить обратно, и приложение будет использовать обычный MosMetroV2.


APK: https://mosmetro.duckdns.org/api/v1/download.php?branch=webview
источник
2020 October 28
Wi-Fi в метро
59-я сборка #webview!

#webview!

Предыдущая сборка отработала гораздо лучше - оба исправления помогли. Но этого немного не хватило.

* Добавлено переопределение метода (GET→POST) для запросов к auth/init_smart (нажатие на кнопку "Вход на 7 минут")
* Изменён метод встраивания скрипта автоматизации: теперь на страницу встраивается блок <script> с виртуальным URL, а приложение подменяет запрос к этому URL на текст скрипта. Наконец-то перехват запросов используется в полную силу :)
* Немного очищен лог подключения с использованием WebView - там всё ещё много всего, но хотя бы одна и та же страница не будет попадать в лог по два раза

Как и в предыдущей сборке, здесь все изменения относятся к MosMetroV2WV - убедитесь, что он включён в настройках.


APK: https://mosmetro.duckdns.org/api/v1/download.php?branch=webview
источник
Wi-Fi в метро
60-я сборка #webview!

#webview!

59-я сборка уже несколько раз успешно подключилась, но само приложение об этом не могло сообщить - оно застревало на ожидании загрузки страницы. Оказалось, что я ещё в паре мест забыл обновить адреса для Санкт-Петербурга.

* Исправлены условия перехода на следующий этап подключения;
* Приложение теперь заменяет init_smart на init, чтобы имитировать нажатие на кнопку "Длительный доступ". Не уверен, насколько хорошо это сработает, но технических препятствий здесь быть не должно;


APK: https://mosmetro.duckdns.org/api/v1/download.php?branch=webview
источник