Sep. 1st, 2016

pozitronik: (Sheridan)
Задача: во внутренней сети есть веб-сервис, нужно дать нескольким тысячам пользователей доступ к нему.
Ограничения: 1) сервис требует как минимум IE10, а лучше - chromium based; 2) у пользователей есть в лучшем случае IE9. Безопасность лютует: приложения запускаются только по белому списку из групповых политик, а хром официально запрещено запускать (даже если установить переносную версию); 3) пользователи не всегда отличаются умом и сообразительностью, им чем проще - тем лучше.
Допущения: 1) безопасники готовы разрешить запуск одного проверенного ими приложения, с условием, что с его помощью за пределы указанного сервиса выбраться будет нельзя; 2) если приложение будет хотя бы выглядеть как один цельный бинарник, шанс пройти проверку у него будет выше.

Резюмируя - нужно было этакое окно на один-единственный сайт. Тупо sitename.exe, можно даже без браузерного интерфейса, вся навигация вполне обеспечивается самим сайтом.

Мысль нулевая: допилить ресурс, чтобы работал в старых версиях IE. С негодованием отвергается всеми, ещё полчаса разработческий чатик кипит ненавистью.
Мысль первая: взять хромиум, допилить, собрать на его базе sitename.exe. Отказано по очевидным причинам.
Мысль вторая: сваять на чём-то вроде Delphi приложение с веб-контролом. Для Дельфи есть хромиумный компонент, так что идея не выглядит нереализуемой. Но хочется ещё проще, и без добавления сущностей.
Мысль третья: доработать сам сервис, впилив в него какое-нибудь REST API, а потом на любом ЯП под любую платформу пилить нативные приложения. В целом идея зашибись, но требует времени (а sitename.exe нужен послезавтра) и сил на поддержку (каждую клиентскую фичу нужно дублировать в API и в приложении).
Мысль четвёртая: взять браузер, и виртуализировать его в чём-то наподобие XenApp. Идея ложится со скрипом - добавляется новая сущность в виде среды виртуализации, на которую безопасники могут залупиться ещё сильнее, например.
Мысль пятая: сделать приложение на каком-нибудь специально созданном для этого инструменте, вроде бы на основе node.js что-то такое было. Но дико не хочется тащить за собой весь обвес, да и по памяти - сыро и криво это всё.
Мысль шестая: а вот о ней подробнее.

Я взял браузер Vivaldi, интерфейс которого написан на HTML+JS+CSS, а кишки - всё тот же хромиум. Соответственно, модифицировать морду браузера элементарно: в файле %version%\resources\vivaldi\style\common.css находятся все стили интерфейса, а вызывается он из %version%\resources\vivaldi\browser.html. Достаточно вписать в browser.html <link rel="stylesheet" href="style/custom.css" />, и далее вносить в этот custom.css нужные модификации.

Вот так выглядит vivaldi совсем без интерфейсных стилей:


Чтобы узнать, какие модификации нужны, запускаем vivaldi.exe с ключами -flag-switches-begin --debug-packed-apps --silent-debugger-extension-api --flag-switches-end. Теперь отладчик может быть вызван на элементах интерфейса, так что можно смотреть айдишники и классы нужных/ненужных элементов управления, и в простейшем случае "скрыть с глаз долой" писать им display:none!important;.
В моём случае я скрыл меню и кнопку Vivaldi (чтобы через них не было доступа к настройкам), боковую панель и меню быстрых команд (чтобы не смущали), и подвинул панель вкладок влево, на место, освободившееся после удаления кнопки.

Затем я открыл настройки (они всё ещё доступны через Alt+P), и подкрутил там так, чтобы выглядело как надо. Страница по умолчанию - наш сайт, его же открывать автоматом при запуске и на новой вкладке, убрать встроенные поисковики, ну и интерфейс по мелочи. Самое главное тут - отредактировать горячие клавиши: убрать доступ к открытию настроек (для себя можно оставить какой-нибудь неочевидный вариант) и отображению разных смущающих панелек, оставить только навигацию. Для совсем параноиков - окно настроек тоже написано на HTML, так что при желании его можно залочить через CSS.

Следующий шаг: по умолчанию vivaldi работает с профилем пользователя в %AppData%\vivaldi\User Data. Можно заставить его хранить профиль в каталоге ..\User Data (к сожалению только так, засунуть профиль в подкаталог относительно бинарника не получится): для этого рядом с vivaldi.exe нужно положить пустой файл stp.viv. Затем в ..\User Data можно скопировать любой уже имеющийся профиль.

Да, хорошо бы подчистить идущие по умолчанию закладки и прочий мусор, всё это лежит в файлах соответствующих названий в подкаталогах Default. К сожалению всё-всё вычистить не удастся, например страница приветствия и ссылки дефолтного Speed Dial, похоже, забиты или в бинарник или в ресурсные файлы - их я модифицировать не решился. Гораздо проще убрать это всё настройками после первого запуска.

Теперь можно отключить отладчик (даже если убрать в настройках горячие клавиши на его вызов, он всё равно остаётся доступен через контекстное меню). Открываем ..\User Data\Default\Preferences, там хранятся настройки в JSON (минифицированном, но разобраться можно). Находим там параметр "devtools", и в свойства к нему добавляем "disabled":false.

Для окончательной настройки осталось добавить только ограничение доступа. Самый очевидный вариант - белый список с одним сайтом; проще всего найти готовое расширение под эти цели. Vivaldi без особых нареканий поддерживает хромовские расширения, после краткого тестирования я остановился на этом простеньком костылике.

Маленький бонус: если заменить \app\%version%\resources\vivaldi\resources\icon_128.png на свою картинку, именно её Vivaldi будет использовать как иконку окна.

Итого: есть каталог, внутри которого лежит vivaldi.exe, рядом - каталоги с кишками. Весит это, конечно, здорово (порядка полутора сотен мегабайт с пустым юзерпрофилем), но нынешний веб - это не хтмлку распарсить. Тем не менее, у пользователя остаётся возможность найти изменённые файлы, и, при понимании процесса, вернуть всё взад, получив таким образом полнофункциональный браузер. Можно усложнить ему это, заодно несколько оптимизировав сборку: с помощью winrar пакуем всё в sfx-архив. Распаковку указываем во временный каталог, отключаем все сообщения и подтверждения, и указываем перезаписывать имеющиеся файлы. После упаковки получаем тот самый sitename.exe, запустив который пользователь получает (через несколько секунд невидимой распаковки, конечно) что-то вроде этого:



Думаю, примерно того же конечного результата можно бы было добиться и с помощью виртуализации, но по вышеуказанным причинам мне это не подошло.
Теперь уговариваем безопасников внести запуск sitename.exe и %tmpdir%\vivaldi.exe в белый список - и voilà, задача решена с приемлимым количеством приседаний.

December 2016

S M T W T F S
    123
45678910
1112131415 1617
18192021222324
25262728293031

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 24th, 2017 12:41 pm
Powered by Dreamwidth Studios