Size: a a a

Wi-Fi в метро

2018 December 02
Wi-Fi в метро
374-я сборка #master!

#master!

* Попытался исправить определение необходимости регистрации в алгоритме MosMetroV2;

* Теперь при вылете приложения библиотека ACRA отправит не только информацию о самом вылете, но и лог подключения. То есть больше не нужно беспокоиться о том, что приложение вылетело и лог потерялся. Отправку отчетов и лога можно отключить по отдельности в пункте "Отладка" в главном меню (но лучше оставить). Также лог можно найти в файле /data/data/pw.thedrhax.mosmetro/files/last.log, но он будет очищен при повторном запуске приложения;

Определение бана в алгоримах MosMetroV2 и V3 пока не исправлено, т.к. сбор информации был ограничен внезапным вылетом приложения. Теперь же необходимую информацию получится собрать без проблем :)

APK: https://mosmetro.duckdns.org/api/v1/download.php?branch=master
источник
2018 December 03
Wi-Fi в метро
Алгоритм V2mcc оказался частично несовместим с V2WV. Дело в том, что в V2WV используется достоверная проверка соединения, а V2 просто верит ответу сервера провайдера. Это довольно легко поправить, просто в текущей сборке нужно отключать V2WV на МЦК.
источник
Wi-Fi в метро
Так, V2mcc+V2WV починил, не сломав при этом ни V2VW, ни V2mcc+V2. Скоро новая сборка :)
источник
2018 December 04
Wi-Fi в метро
375-я сборка #master!#master!

* MosMetroV2: Код страницы авторизации вернулся в лог. Это поможет в будущем быстрее поправить проблему с определением бана и необходимости регистрации устройства;

* Исправлено сохранение результата алгоритма при прерывании. Проще говоря, теперь приложение снова сможет показать уведомление, если устройство нужно зарегистрировать в сети. Оказалось, что оно давно было сломано;

* Теперь алгоритм, запущенный внутри другого алгоритма, может прервать весь процесс подключения в случае ошибки. Это я не досмотрел цепочку передачи сигнала (она идет от основного алгоритма ко вложенным, но не наоборот);

* В лог добавлено сообщение на случай сбоя при инициализации любого из алгоритмов. Там всё просто и ломаться нечему, но кто его знает ¯\_(ツ)_/¯;

45-я сборка #webview!#webview!

* Всё то же самое, что было в сборках 374 и 375 ветки #master. Т.е. теперь и сюда пришла отправка логов через ACRA и всё такое :)

* Исправлена совместимость алгоритмов V2mcc и V2WV (была ошибка, но всё-равно подключалось);


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

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

#master и 46-я сборка #webview!

* Добавлена поддержка перехвата перенаправлений (надеюсь, ничего не сломается):
 - Удалось упростить определение бана и необходимости в регистрации в алгоритмах V2 и V2WV;
 - Все запросы теперь пишутся в лог автоматически. Это привело к увеличению размера лога, но зато теперь точно вся полезная информация будет в отчете. Со временем обратно упакую лог, убрав всё лишнее;
 - Алгоритм V2mcc стал гораздо проще и быстрее. Когда я его проверял последний раз, он отработал примерно за 4 секунды;

* [PR-226] Исправлено автоподключение на Android 9+ (спасибо zikasak);


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

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

#master!

* Улучшена стабильность ACRA. Теперь отчеты о вылетах должны меньше теряться;



48-я сборка #webview!

#webview!

* То же самое, что в 377-й сборке #master;

* Исправлен старый баг, приводящий к вылету приложения при повторной попытке подключения с тем же алгоритмом. Возможно, что этот баг также приводил к вылетам и в других случаях.


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

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

#master!

* Должна быть исправлена совместимость обхода welcome.wi-fi.ru при отключенном MosMetroV3 и нового метода перехвата запросов. Из-за этой ошибки приложение могло иногда падать, но в основном она вызывала вылеты в ветке #webview.

49-я сборка #webview!

#webview!

* То же самое, что и в 378-й сборке #master;

* Исправлено аварийное завершение WebViewProvider — вторая причина вылетов при выключенном алгоритме MosMetroV3.


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

webview: https://mosmetro.duckdns.org/api/v1/download.php?branch=webview
источник
Wi-Fi в метро
50-я сборка #webview! Продолжаем исправлять вылеты и проверять эффективность этих исправлений через ACRA.

Достаточно просто установить эту сборку и уронить где-нибудь. Если не упадёт, то тоже отлично)

APK: https://mosmetro.duckdns.org/api/v1/download.php?branch=webview
источник
Wi-Fi в метро
Что-то как-то слишком много проблем стало возникать. Решил откатить состояние проекта до последнего стабильного.

379-я сборка #master#master: Откат до состояния сборки 375 + изменения для ACRA из 377-й;

51-я сборка #webview#webview: Откат до состояния сборки 45 + изменения длся ACRA из 48-й;

Теперь всё должно будет работать как раньше, пока у меня будет время на доработку этого ужаса :)


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

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

Попытался исправить жесткое зацикливание скрипта на странице авторизации. На эмуляторе и полноценном браузере (с рекламой и без) скрипт теперь работает практически идеально. Однако в настоящей сети его ещё не удалось проверить, так что может стать как лучше, так и хуже.

Суть изменения: Раньше скрипт сканировал и прокликивал всю страницу при модификации каждого элемента, а теперь будет сканировать только изменённые элементы и их потомков. Также каждый клик откладывается на 500мс, чтобы больше не было настолько жестких циклов. Так что рекламные элементы теперь имеют меньшую вероятность что-нибудь сломать.

Если вы знаете JavaScript, то, возможно, захотите что-нибудь улучшить. Также этот скрипт можно загрузить в GreaseMonkey, если добавить заголовок (пример).

P.S. Ну вот, опять изменение в пятницу вечером. Хотя уже лучше, чем ничего :)


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

#webview!

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

* Скрипт MosMetroV2.js теперь проверяет не только нахождение элемента на странице (display: none), но и его видимость (visibility: 'hidden'). Дело в том, что на странице авторизации появилась невидимая кнопка, которая становится видимой на поздних этапах авторизации. Если нажать на эту кнопку в невидимом состоянии, она блокируется, не давая продолжить вход. Не знаю, специально ли это было сделано, но теперь скрипт не будет нажимать на такие кнопки раньше времени;

P.S. Ждал, пока приложение сломается, и оно всё-таки сломалось. И да, новая сборка спустя 7 месяцев и опять в пятницу вечером ¯\_(ツ)_/¯

TL/DR: Исправлен вылет по таймауту в алгоритме MosMetroV2WV (зацикливание на generate_204).


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

Скрипт MosMetroV2.js для GreaseMonkey (подходит для браузеров на ПК): https://gist.github.com/TheDrHax/4e837578aa5d2898779a9d24a09a045f
источник
2019 September 10
Wi-Fi в метро
Экспериментальная ветка webview-experimental снова доступна!

1. Переход на compile SDK 28, обновление системы сборки, совместимость проекта с Eclipse и VSCode. Эти изменения ничего не должны сломать, т.к. target SDK по-прежнему остаётся на номере 25. Но на всякий случай сначала проверим здесь, а уже потом перенесу в остальные ветки;

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

Улучшения лога:
3.1. Лог можно посмотреть, не вызывая ручное подключение. Для этого добавлены ярлыки и пункт в главном меню;
3.2. Последние 100 строк обычного лога и 2000 строк расширенного сохраняются в памяти приложения и восстанавливаются при его открытии. Так что теперь не страшно закрывать приложение — лог всё-равно будет на месте. Очистить его вручную по-прежнему можно кнопкой в окне просмотра.
3.3. (только webview) В разы уменьшен размер лога подключения. Теперь вместо HTML кода мутировавших элементов в лог выводятся только их CSS-селекторы.

4. Совместимость с Private DNS — новой функцией Android 9. Экспериментальная версия уже успешно работает с включённым Private DNS, однако ещё есть проблемы с доступом в интернет из остальных приложений. Я работаю над этим (см. пункт 5).

5. Изменено поведение проверки generate_204. Теперь приложение проверяет соединение с интернетом так же, как это делает Android. При этом надёжность проверки должна сохраниться, т.к. перепроверка результата по HTTPS никуда не делась. Таким образом мы снова пытаемся реагировать на midsession — перенаправление на рекламу при работающем доступе в интернет. Раньше уже были попытки это реализовать, но новое решение должно быть гораздо более надёжным. Изменения в generate_204 — это лишь начало.

Раздельные файлы логов и новое поведение generate_204 ещё не проверялись и могут работать сильно неправильно.

Ближайший план действий:
1. Убедиться, что пункты 1, 2 и 3 работают достаточно стабильно;
2. Собрать актуальную информацию об адресах generate_204 для пункта 5 (об этом я напишу чуть позже);
3. Реализовать алгоритм для деактивации midsession, если это потребуется (может и без него сработать);
4. Дополнительно сократить размер лога за счёт сжатия или очистки HTML кода страниц (пока не уверен);

Как только выполним всё это, выпущу новые сборки #master и #webview. А если удастся реализовать пункт 3, то и новый полноценный релиз можно будет сделать :)


APK: https://mosmetro.duckdns.org/api/v1/download.php?branch=webview-experimental (также доступно через встроенные обновления)
источник
Wi-Fi в метро
Насчёт сбора актуальной информации об адресах generate_204.

TL/DR: Следующие 4 абраза описывают, зачем оно всё нужно. Сам тест находится ниже.

Приложение использует эти адреса для того, чтобы понять, есть ли у устройства доступ в интернет и нужно ли авторизовываться в сети. Аналогичный механизм использует и сам Android, однако там всё не так надёжно. Дело в том, что провайдеры (особенно МаксимаТелеком) перехватывают запросы к этим адресам и таким образом манипулируют информацией о состоянии Wi-Fi в системе. Приложение проверяет результаты этих проверок по HTTPS, полностью исключая ложно-позитивные случаи и сокращая ложно-негативные. Android ничего не перепроверяет и всегда использует один из четырёх адресов.

Так вот, вы, скорее всего, замечали, что когда приложение в первый раз авторизуется в сети, Android показывает, что интернет есть. Затем, спустя несколько минут, рядом со значком Wi-Fi появляется восклицательный знак. При этом доступ в интернет есть, но Android считает, что его нет. Это происходит из-за того, что провайдер намеренно подменяет ответ generate_204. В данном проекте это состояние получило название midsession (по параметру в адресе перенаправления). В данный момент приложение невосприимчиво к этой подмене, поэтому оно показывает "Уже подключено".

При чём тут Private DNS? Так как для работы Private DNS нужно соединение с определённым внешним сервером, Android блокирует DNS запросы, пока нет интернета. Это логично, так как задача Private DNS — не допускать утечек запросов к провайдеру. Но откуда Android знает, что интернета нет? Правильно, из результата generate_204. В итоге получается, что пока провайдер обманывает систему, DNS запросы из неё отправляться не будут, а значит и доступа в интернет у приложений не будет. Наше приложение обходит эту проблему при помощи собственного вшитого DNS-клиента, но остальным это не поможет.

Раз мы не можем заставить Android более надёжно проверять соединение с интернетом, нужно решать проблему с midsession. Для этого придётся немного снизить надёжность проверки в приложении, чтобы оно реагировало на подмену и делало то, что хочет провайдер — смотрело рекламу. Вот для этого и нужно обновить информацию об адресах, найти надёжные и ненадёжные. Издалека зашёл, да? :D



В общем, если у вас есть Termux или вы можете его установить (root не требуется), то у меня есть для вас скрипт, который опросит различные адреса generate_204 и выведет их IP-адреса и коды ответов.

Подготовка (всё делается в Termux):
pkg install -y curl dnsutils; curl -s 'https://gist.githubusercontent.com/TheDrHax/2890644afe52785ac13eeacfdd645c31/raw/gen_204.sh' > gen_204.sh

Запуск скрипта: bash gen_204.sh



Инструкция по сбору данных:

1. Подождите, пока Android покажет восклицательный знак у Wi-Fi или уведомление "Требуется вход в сеть", но при этом чтобы был доступ в интернет (тот же ВК и подобные приложения должны быть способны подключиться). Только не проверяйте интернет через браузер! (ну или хотя бы не заходите на сайты без шифрования);
2. Запустите скрипт, сделайте снимок результата;
3. Отправьте этот скриншот мне в ЛС @TheDrHax, желательно уточнив при этом вид транспорта и город;



Для продолжения работы мне достаточно 1-2 отчёта из московского и питерского метро. Наземный транспорт тоже интересен, но с ним сложнее — соединение не такое стабильное. Я напишу ждесь сообщение, когда вся информация будет собрана, чтобы вам не пришлось повторять одно и то же лишний раз. Заранее спасибо! :)
источник
Wi-Fi в метро
Пример вывода скрипта, чтобы было ясно, что от него ожидать.
источник
Wi-Fi в метро
Полученные отчёты:

1. Питер: (2) подмена DNS, всё ОК; (3) всё ОК; (4) отсутствует;
2. Москва (без DNS): (2) ложные 204; (3) всё ОК; (4) отсутствует;
3. Москва (без DNS): (2) ложные 204; (3) всё ОК; (4) ложные 200;

Подмены DNS:
* connectivitycheck.gstatic.com
* www.gstatic.com
* connectivitycheck.android.com

Ложные 204 (возможная утечка трафика):
* mt0.google.com (1/3)
* mt1.google.com (1/3)
* mt2.google.com (1/3)
* mt3.google.com (1/3)
* connectivitycheck.gstatic.com (2/3)
* connectivitycheck.android.com (2/3)
* www.google.com (2/3)
* www.gstatic.com (1/3)

Ложные 200:
* connectivitycheck.gstatic.com
* www.gstatic.com
* connectivitycheck.android.com
источник
Wi-Fi в метро
Первый этап тестирования завершён! Сейчас постараюсь доработать скрипт, чтобы исправить некоторые проблемы и завтра можно будет повторить для максимальной точности. Но уже текущие результаты помогли выделить 2 дополнительных адреса для приложения. Ещё раз спасибо всем :)

UPD: Скрипт обновил. Теперь он:
1. Не игнорирует SSL-сертификаты, чтобы проверить, от правильного ли сервера пришёл ответ;
2. Должен отработать быстрее, если DNS недоступен (пока не понял, чем оно вызвано);
3. Выводит данные в более удобном формате: сначала коды, потом ссылка и IP в скобках;
4. В начале работы выводит IP устройства, если доступ в интернет есть (проверка на утечки трафика), а также текущий DNS, по которому работает dig;

Инструкция остаётся та же, только надо повторить скачивание скрипта командой `
curl -s 'https://gist.githubusercontent.com/TheDrHax/2890644afe52785ac13eeacfdd645c31/raw/gen_204.sh' > gen_204.sh
`, если вы уже его скачивали.

Отчёты буду проверять, скорее всего, во второй половине дня. В это же время выложу результаты сюда.
Telegram
Wi-Fi в метро
Насчёт сбора актуальной информации об адресах generate_204.

TL/DR: Следующие 4 абраза описывают, зачем оно всё нужно. Сам тест находится ниже.

Приложение использует эти адреса для того, чтобы понять, есть ли у устройства доступ в интернет и нужно ли авторизовываться в сети. Аналогичный механизм использует и сам Android, однако там всё не так надёжно. Дело в том, что провайдеры (особенно МаксимаТелеком) перехватывают запросы к этим адресам и таким образом манипулируют информацией о состоянии Wi-Fi в системе. Приложение проверяет результаты этих проверок по HTTPS, полностью исключая ложно-позитивные случаи и сокращая ложно-негативные. Android ничего не перепроверяет и всегда использует один из четырёх адресов.

Так вот, вы, скорее всего, замечали, что когда приложение в первый раз авторизуется в сети, Android показывает, что интернет есть. Затем, спустя несколько минут, рядом со значком Wi-Fi появляется восклицательный знак. При этом доступ в интернет есть, но Android считает, что его нет. Это происходит из-за…
источник
2019 September 11
Wi-Fi в метро
Полученные отчёты:

1. Москва: (2) ложные 204; (3) не полный; (4) отсутствует;
2. Москва: (2) ложные 204, не полный; (3) всё ок; (4) отсутствует;
3. Москва: (2) ложные 204; (3) всё ок; (4) отсутствует;
4.1. Москва (трамвай): (2) ложные 204; (3) ошибки по некоторым HTTPS; (4) отсутствует;
4.2. Москва: (2) ложные 204; (3) всё ок; (4) отсутствует;

Ложные 204:
* connectivitycheck.gstatic.com
* www.google.com
* www.gstatic.com
* gstatic.com (один раз)
* connectivitycheck.android.com

Наблюдения:
* В Москве тест DNS не работает;
* В наземном транспорте ненадёжные домены продолжают подменяться после подключения (HTTPS выдаёт ошибку на этапе (3));
источник
Wi-Fi в метро
Думаю, по этапам (2) и (3) данных уже достаточно, а вот этап (4) почти ни у кого не наступил (всего 1 случай за два дня). Поэтому я значительно упростил инструкцию, оставив только 4-й этап. Если кратко, то приложение теперь можно не выключать, достаточно пользоваться интернетом и дождаться восклицательного знака у иконки Wi-Fi или уведомления "Требуется вход в сеть", после чего запустить скрипт и сделать один скриншот. Это может произойти спустя 10-15 минут после входа в сеть, так что нужно именно ждать.

Также я обновил скрипт, убрав из него все проверки DNS. Эти проверки, похоже, сломаны в Termux, поэтому они только замедляют тестирование. Команда для обновления скрипта остаётся прежней:
curl -s 'https://gist.githubusercontent.com/TheDrHax/2890644afe52785ac13eeacfdd645c31/raw/gen_204.sh' > gen_204.sh


Простите за спам, осталось совсем немного :)
Telegram
Wi-Fi в метро
Насчёт сбора актуальной информации об адресах generate_204.

TL/DR: Следующие 4 абраза описывают, зачем оно всё нужно. Сам тест находится ниже.

Приложение использует эти адреса для того, чтобы понять, есть ли у устройства доступ в интернет и нужно ли авторизовываться в сети. Аналогичный механизм использует и сам Android, однако там всё не так надёжно. Дело в том, что провайдеры (особенно МаксимаТелеком) перехватывают запросы к этим адресам и таким образом манипулируют информацией о состоянии Wi-Fi в системе. Приложение проверяет результаты этих проверок по HTTPS, полностью исключая ложно-позитивные случаи и сокращая ложно-негативные. Android ничего не перепроверяет и всегда использует один из четырёх адресов.

Так вот, вы, скорее всего, замечали, что когда приложение в первый раз авторизуется в сети, Android показывает, что интернет есть. Затем, спустя несколько минут, рядом со значком Wi-Fi появляется восклицательный знак. При этом доступ в интернет есть, но Android считает, что его нет. Это происходит из-за…
источник
Wi-Fi в метро
Мне прислали 4 отчёта из московского метро, все они совпадают со вчерашними результатами по ложным ответам с кодом 200. В данный момент экспериментальная сборка использует только первый адрес, так что теперь можно будет дополнить список!

Не думаю, что отчёты из московского метро чем-то ещё помогут, однако если у вас есть результаты из наземного транспорта или метро Санкт-Петербурга, то они ещё могут пригодиться, т.к. там есть некоторые отличия. А так сбор данных можно пока считать завершённым. Спасибо всем, кто принял участие в тестировании! :)
источник
2019 September 12
Wi-Fi в метро
25-я сборка #webview-experimental!#webview-experimental!

* Полностью переписана проверка generate_204. Теперь она проходит от 2 до 3 этапов для того, чтобы отсеивать ложно-положительные результаты и использовать ложно-отрицательные, когда это необходимо. Теперь приложение должно замечать те моменты, когда Android считает, что интернета нет (а он есть), но подключению это мешать не будет (в прошлой сборке могло произойти зацикливание). Если всё сработает, то останется только доработать алгоритмы для midsession;

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

* Встроенный DNS-клиент теперь поддерживает одновременное использование нескольких серверов. Это должно исправить ошибки в некоторых случаях, но я подозреваю, что проблема там кроется в чём-то другом;

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


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