Разработка надстройки Office — неверный URL-адрес GET (_host_Info=)

В настоящее время я разрабатываю надстройку MS Word Office, используя интерфейс JavaScript, предоставленный Microsoft. Я сделал тестовую реализацию с использованием бэкэнда Django, где все работало нормально.

Однако для конечного продукта мне нужно интегрировать функциональность с существующим Java Backend, который работает в нескольких конфигурациях, которые я не могу контролировать. Состоит из Vaadin для пользовательского интерфейса и в основном Tomcat (но не всегда) в качестве контейнера сервлетов.

Я столкнулся с проблемой, заключающейся в том, что IFrame, работающий внутри Word, добавляет нежелательный и искаженный _host_info к URL-адресу запроса, который содержит символы канала без urlencoded. например: Журнал Tomcat:

"GET /myapp/?_host_Info=Word|Win32|16.01|en-US HTTP/1.1" 200 2101

Этот неправильный URL создает следующее исключение:

java.lang.RuntimeException: Invalid location URI received from client.
... full stack trace at bottom of the post...
Caused by: java.net.URISyntaxException: Illegal character in query at index          45: https://localhost:8443/myapp/?_host_Info=Word|Win32|16.01|en-US

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

<SourceLocation DefaultValue="https://localhost:8443/myapp/ " />

Проверяя документацию, я не обнаружил такого поведения. там, так что я мог пропустить что-то. Запрос информации о хосте упоминается в этот пост в блоге, но кажется, что он не должен быть частью URL.

  • Можно ли запретить надстройке Office добавлять: ?_host_Info=Word|Win32|16.01|en-US HTTP/1.1 к запросу?

  • Если нет, есть ли правильный способ отфильтровать/игнорировать эту часть URL-адреса с помощью Tomcat? Поскольку все приложение работало правильно с моим веб-сервером Apache и бэкэндом Django, URL-адрес тоже был получен, но он работал.

Что касается второго вопроса, я уже пытался реализовать фильтр сервлета, который должен удалить рассматриваемый параметр. Но поскольку он использует ту же библиотеку Java для анализа URL-адреса, чтобы просмотреть его, возникает то же самое исключение.

> May 23, 2016 11:04:51 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [MyUIServlet] in context with path [/word-to-moxis] threw exception [com.vaadin.server.ServiceException: java.lang.RuntimeException: Invalid location URI received from client] with root cause
java.net.URISyntaxException: Illegal character in query at index h(invalidated link because of 10 reputation / two links allowed policy)ttps://localhost:8443/myapp/?_host_Info=Word|Win32|16.01|en-US
    at java.net.URI$Parser.fail(URI.java:2848)
    at java.net.URI$Parser.checkChars(URI.java:3021)
    at java.net.URI$Parser.parseHierarchical(URI.java:3111)
    at java.net.URI$Parser.parse(URI.java:3053)
    at java.net.URI.<init>(URI.java:588)
    at com.vaadin.server.Page.init(Page.java:651)
    at com.vaadin.ui.UI.doInit(UI.java:679)
    at com.vaadin.server.communication.`UIInitHandler`.getBrowserDetailsUI(UIInitHandler.java:214)

Обновление:

Следующий Quick & Dirty Hack служит обходным путем. Все еще озадачен тем, почему они решили кодировать информацию таким образом:

public class AddinServletRequestWrapper extends HttpServletRequestWrapper {

    Map<String, String[]> parameterMap;

    public AddinServletRequestWrapper(HttpServletRequest originalRequest) {
        super(originalRequest);
        parameterMap = new HashMap<String, String[]>(originalRequest.getParameterMap());
        parameterMap.remove("_host_Info");
    }

    @Override
    public String getParameter(String name) {
        // TODO: Improve
        String[] value = parameterMap.get(name);
        if (value == null || value.length == 0)
            return null;
        if(name == "v-loc"){
            return value[0].replace('|', '_');
        }

        return value[0];
    }
}

Обновление 2 – 17 февраля:

С более поздними обновлениями Tomcat обходной путь, описанный выше, больше не подходит. Как отмечено в комментариях, версии 7.0.73, 8.0.39, 8.5.7 имеют более строгую политику URL. Поэтому нет решения использовать версии tomcat для размещения офисных надстроек без дополнительных инструментов. Я очень надеюсь, что эта ситуация скоро изменится, потому что такая маленькая, вероятно, бесполезная строка может использовать такие проблемы с развертыванием.


person Matthias P.    schedule 23.05.2016    source источник


Ответы (4)


ОБНОВЛЕНИЕ: API теперь доступен для использования:

console.log(Office.context.host); //пример: Эксель

console.log(Office.context.platform); //пример: ПК, MAC, IOS, null (для отдельного веб-сайта)

Возможные значения для хоста: Word Excel PowerPoint Outlook OneNote Project Access

Возможные значения для платформы: ПК OfficeOnline Mac iOS Android Universal


Недавно мы удалили параметры запроса из URL-адреса в связи с проблемами, отмеченными в одностраничных приложениях. _host_info_ больше не добавляется к надстройкам, открытым в браузере (Office Online).

@Matthias: Для этой проблемы добавление тега office-js было бы более точным. Я не мог добавить, учитывая ограничение размера тегов.

person Sudhi Ramamurthy    schedule 05.12.2016
comment
Привет @Sudhi, _host_Info все еще отображается в Outlook Office365. Что касается 12 февраля 2017 года, мы сталкиваемся с этим в Outlook для Интернета и Windows. Служба поддержки Microsoft (617021492952666) сообщила, что отключить ее невозможно, и предложила найти обходной путь здесь. Начиная с Apache Tomcat 7.0.73 такие URL-адреса рассматриваются как небезопасные и отклонен сервером на очень низком уровне (клапан или фильтр невозможен). Я рад прочитать, что вы удалили этот параметр запроса. Но когда мы могли ожидать этого в Office365, а затем в локальных установках и на сервере Exchange? - person Peter Nedonosko; 15.02.2017
comment
Спасибо за ответ, Судхи. Я изменил теги поста. Что касается вашего изменения в Office Online, есть ли у вас планы по переносу этого изменения в настольные версии Office? Это было бы очень признательно, так как это серьезное раздражение. Мы столкнулись с той же проблемой, которую описывает @Peter — наша надстройка перестает работать при обновлении до более поздних версий tomcat. - person Matthias P.; 08.03.2017
comment
У меня такая же проблема. Что касается 13 февраля 2018 года, я сталкиваюсь с этим в Outlook для Интернета. Я думаю, что этот дополнительный параметр запроса _host_info станет более широким вопросом. Я подключаю свои приложения к службе Dropbox, используя поток oauth Dropbox из веб-надстроек Outlook. И Dropbox отвечает на этот дополнительный параметр запроса как на неверный запрос, поэтому я не могу подключиться к службе Dropbox в веб-надстройках Outlook. - person masphei; 13.02.2018
comment
Я проверю и отвечу, можно ли избежать символа трубы. Если нет, будет ли это работать, если мы экранируем его, чтобы сделать URL безопасным? Или веб-серверу Tomcat все равно не нравится разделитель каналов. - person Sudhi Ramamurthy; 15.02.2018
comment
Привет @Sudhi. Спасибо за ваш ответ и изменения API. Я полностью пропустил уведомления для этой темы. Я могу подтвердить, что это работает во всех последних версиях Office. - person Matthias P.; 29.04.2019

Если у вас есть апач с включенным mod_rewrite перед вашим котом, можно добавить это грязное правило апача, чтобы infly перекодировать запрос Outlook:

RewriteCond %{QUERY_STRING} (.*)_host_Info=(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)
RewriteRule ^(.*) "$1?%1_host_Info=%2\%7c%3\%7c%4\%7c%5\%7c%6\%7c%7" [QSD,PT]

Я надеюсь, что это может помочь

person Vincent    schedule 08.03.2017
comment
Спасибо за совет! На данный момент использование apache или nginx кажется единственным решением, если нужно использовать более новые версии Tomcat. - person Matthias P.; 08.03.2017
comment
Да, конечно. Кстати, также можно избежать условия перезаписи, используя mod_jk и коннектор ajp на tomcat, поскольку на него не влияет исправление, выполненное для CVE-2016-6816. - person Vincent; 08.03.2017
comment
Еще раз спасибо, всегда приятно иметь несколько вариантов. - person Matthias P.; 09.03.2017

Это изменение URL-адреса также наносит ущерб Angular, если вы вообще играете с urlRouteProvider. Кажется, создается цикл дайджеста, потому что это событие изменения местоположения для запуска внутри Angular, которое превышает предел 10 циклов дайджеста. :(

person Chris Beiter    schedule 10.08.2016
comment
Извините за поздний ответ! Это отстой, я надеюсь, что вы нашли решение в то же время. Мне удалось найти правильный параметр фильтра сервлета для фильтрации, и теперь он хорошо интегрируется с Vaadin. Все равно... раздражение. Я отредактировал свой пост с моим обходным путем. - person Matthias P.; 02.10.2016
comment
Да, решение состояло в том, чтобы вернуться в Microsoft и сказать им, что они не должны изменять URL-адрес таким образом, чтобы вызвать цикл дайджеста в Angular! Видимо работают или уже выпустили патч. :) - person Chris Beiter; 15.03.2017

У нас была похожая проблема с этой.

Наше решение состояло в том, чтобы понизить нашу версию tomcat с 8.0.39 до 8.0.30.

Посмотрите также это: |' в параметрах запроса?

Надеюсь это поможет.

person David Sanz    schedule 25.04.2017
comment
Это не дает ответа на вопрос. Получив достаточную репутацию, вы сможете /comment">прокомментировать любой пост; вместо этого дайте ответы которые не требуют разъяснений от спрашивающего. – Из обзора - person xlm; 26.04.2017
comment
@xlm На самом деле он действительно дает ответ на этот вопрос. Может быть, короткий, может быть, плохо описанный, но он дает ответ. - person Eel Lee; 26.04.2017