pozitronik: (Sheridan)
[personal profile] pozitronik
Задача: во внутренней сети есть веб-сервис, нужно дать нескольким тысячам пользователей доступ к нему.
Ограничения: 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à, задача решена с приемлимым количеством приседаний.
From:
Anonymous( )Anonymous This account has disabled anonymous posting.
OpenID( )OpenID You can comment on this post while signed in with an account from many other sites, once you have confirmed your email address. Sign in using OpenID.
User
Account name:
Password:
If you don't have an account you can create one now.
Subject:
HTML doesn't work in the subject.

Message:

 
Notice: This account is set to log the IP addresses of everyone who comments.
Links will be displayed as unclickable URLs to help prevent spam.

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 Sep. 22nd, 2017 09:59 am
Powered by Dreamwidth Studios