Добрый день!

Мы создали расширение для нашего сайта. Оно устанавливается и работает нормально.
Однако расширение не может быть обновлено в Firefox (как в 3.5.7, так и в 3.6.3) - в диалоговом окне Add-ons появляется сообщение: "Произошла ошибка при попытке поиска обновлений..." и никаких сообщений в консоли ошибок.
Для того чтобы создать пакет обновления, я использую сценарий, описанный здесь (использование HTTPS, подписка RDF файлов с помощью McCoy, добавление хеша XPI файла в update.rdf).

Вот мой install.rdf (содержащийся в файле xpi):

Выделить код

Код:

<?xml version="1.0"?>
<RDF:RDF xmlns:em="http://www.mozilla.org/2004/em-rdf#"
   xmlns:NC="http://home.netscape.com/NC-rdf#"
   xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <RDF:Description RDF:about="urn:mozilla:install-manifest" 
   em:id="extension.id" 
   em:type="2" 
   em:version="1.7" 
   em:name="company ECM Extension" 
   em:description="The ECM extension provides integration tools for working with company services." 
   em:creator="company Europe AB" 
   em:homepageURL="http://www.company.com" 
   em:iconURL="chrome://ecmext/content/ecmext.png" 
   em:aboutURL="chrome://ecmext/content/about.xul"

   em:updateURL="https://localhost/distrib/update.rdf" 
   em:updateKey="MIGfMA0GCSqGSIb3DQEBAQUAA4G.....">

    <em:targetApplication RDF:resource="urn:mozilla:firefox" />
  </RDF:Description>
  <RDF:Description RDF:about="urn:mozilla:firefox" em:id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}" em:minVersion="3.5" em:maxVersion="3.6.3" />
</RDF:RDF>

Вот update.rdf:

Выделить код

Код:

<?xml version="1.0"?>
<RDF:RDF xmlns:em="http://www.mozilla.org/2004/em-rdf#"
         xmlns:NC="http://home.netscape.com/NC-rdf#"
         xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <RDF:Seq RDF:about="rdf:#$Vi19E3">
    <RDF:li RDF:resource="urn:company:ecmext"/>
  </RDF:Seq>
  <RDF:Description RDF:about="urn:mozilla:firefox"
                   em:id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"
                   em:minVersion="3.5"
                   em:maxVersion="3.6.3"

                   em:updateLink="https://localhost/distrib/ecmext_1_7.xpi"
                   em:updateHash="sha256:7e6139b71decd5c6f8f6ee4e58c581f184ecbfd178436da2232baa79f4fe23fd" />

  <RDF:Description RDF:about="urn:company:ecmext"
                   em:version="1.7">
    <em:targetApplication RDF:resource="urn:mozilla:firefox"/>
  </RDF:Description>
  <RDF:Description RDF:about="urn:mozilla:extension:extension.id"

                   em:signature="MIGTMA0GCSqGSIb3DQEBDQUAA4GBAFL0pBKuHY3oLY84qd.....">

    <em:updates RDF:resource="rdf:#$Vi19E3"/>
  </RDF:Description>
</RDF:RDF>

(длинные значения BASE64 усечены)

Сообщение выскакивает мгновенно, сразу после запроса к update.rdf. Запрос к файлу ecmext_1_7.xpi не выполняется.
Таким образом, проблема либо в файле update.rdf ИЛИ в ответе сервера. Не могу придумать других причин!

Вот заголовки ответа сервера:

Выделить код

Код:

HTTP/1.1 200 OK
Cache-Control: public, max-age=7776000
Content-Length: 1238
Content-Type: text/xml
Expires: Tue, 24 Aug 2010 18:04:49 GMT
Last-Modified: Wed, 26 May 2010 17:38:42 GMT
Accept-Ranges: none
Etag: "509423464d6"
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
X-UA-Compatible: IE=EmulateIE7
Date: Wed, 26 May 2010 18:04:49 GMT

Вот для сравнения ответ addons.mozilla.org:

Выделить код

Код:

HTTP/1.1 200 OK
Server: Apache
X-Backend-Server: pp-app-amo01
Cache-Control: public, max-age=3600
Content-Type: text/xml
Date: Wed, 26 May 2010 17:20:38 GMT
Keep-Alive: timeout=5, max=994
Expires: Wed, 26 May 2010 18:20:38 GMT
Accept-Ranges: bytes
Via: Moz-Cache-pp-zlb01
Last-Modified: Wed, 26 May 2010 17:20:38 GMT
X-Powered-By: PHP/5.2.9
Content-Length: 1063
Connection: close
X-Cache-Info: cached

Существенной разницы не нахожу.

Кроме того, возможно ли, что Firefox выбрасывает ошибку, когда находит self-signed SSL certificate сервера, установленный на моем рабочем компьютере? Если возможно (в чем я сомневаюсь), как же тогда вести разработку, если не покупать "правильные" сертификаты?

Короче, куда-то я не туда копаю... Пожалуйста, ткните в причину и завершите мое сегодняшнее безумие!

Спасибо ;)

Zeiss
Какой-то странный update.rdf. См. примеры в https://developer.mozilla.org/en/Extens … RDF_Format
Что касается отладки, то:

The update mechanism logs information to the console, and display various information which can help you to find problem. To enable the log:

   1. Set the value of extensions.logging.enabled to true (using URL about:config)
   2. Run Firefox from command with option -console

If you encounter problems, search the output in console for your extension id, and see if failures were logged.

26-05-2010 23:51:21

em:updateLink="https://localhost/distrib/ecmext_1_7.xpi"
                   em:updateHash="sha256:7e6139b71decd5c6f8f6ee4e58c581f184ecbfd17

Насколько я понимаю, нужно либо использовать https в updateLink, либо updateHash. И то и то - не нужно. Вся суть updateHash - дешёвая замена для https.

Unghost пишет

Да, оно! Спасибо за исчерпывающий первоисточник!
Использовал хеш+https "для верочки" :)
На продакшн сервере сертификат правильный, там всё ОК, а на тестовом и dev машинах - self-signed, которые мозиллой режектятся.

Unghost пишет

Какой-то странный update.rdf

Его так переорганизовал МакКой.

Zeiss

а на тестовом и dev машинах - self-signed, которые мозиллой режектятся.

Ну вроде можно добавить свой самоподписанный сертификат в базу сертификатов Mozilla при помощи Certificate Database Tool.

banbot пишет

Ну вроде можно добавить свой самоподписанный сертификат в базу сертификатов Mozilla при помощи Certificate Database Tool.

А разве сертификаты туда не добавляются через диалог, когда нажимаешь Add Exception на странице "This Connection is Untrusted"?
Энивей, решено путём отказа от обновлений по https.

Zeiss

А разве сертификаты туда не добавляются через диалог, когда нажимаешь Add Exception на странице "This Connection is Untrusted"?

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

banbot пишет

иногда надо развернуть дистрибутив с уже добавленными сертификатами

Спасибо за ценную информацию!
У нас, правда, не корпоративные пользователи, и самописный сертификат используется только для разработки.

У меня тоже нихочет обновляться, самоподписаный сертификат на локальном сервере. mime-типы выставил. добавил сертификат в исключение.
Fiddler'ом перехватывал update.rdf'ы других расширений, и делал по их аналогии... Лиса-Алиса молчит как партизан и не обновляет, update.rdf загружает, но ошибок никаких не выдаёт. :angry: Может точно, что дело в HTTP-заголовках?
install.rdf:

Выделить код

Код:

<?xml version="1.0" encoding="UTF-8"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
  <Description about="urn:mozilla:install-manifest">
    <em:id>aagent@mozilla.org</em:id>
    <em:version>1.1</em:version>
    <em:type>2</em:type>
    <em:targetApplication>
      <Description>
        <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
        <em:minVersion>3.0a1</em:minVersion>
        <em:maxVersion>7.0a1</em:maxVersion>
      </Description>
    </em:targetApplication>
    <em:name>AutoCrack Agent</em:name>
    <em:bootstrap>false</em:bootstrap>
    <em:unpack>false</em:unpack>
    <em:creator>Eugen Li</em:creator>
    <em:updateURL>https://money.local/aca/update.rdf</em:updateURL>
    <em:optionsURL>chrome://autocrackagent/content/form_settings.xul</em:optionsURL>
  </Description>
</RDF>

update.rdf:

Выделить код

Код:

<?xml version="1.0"?>
<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
  <RDF:Description about="urn:mozilla:extension:aagent@mozilla.org">
    <em:updates>
      <RDF:Seq>
        <RDF:li resource="urn:mozilla:extension:aagent@mozilla.org:1.2" />
      </RDF:Seq>
    </em:updates>
  </RDF:Description>
  <RDF:Description about="urn:mozilla:extension:aagent@mozilla.org:1.2">
    <em:version>1.2</em:version>
    <em:targetApplication>
      <RDF:Description>
        <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
        <em:minVersion>3.0a1</em:minVersion>
        <em:maxVersion>7.0a1</em:maxVersion>
        <em:updateLink>http://money.local/aca/aca.xpi</em:updateLink>
    <em:updateInfoURL>https://money.local/aca/</em:updateInfoURL>
        <em:updateHash>sha256:1c47d57fecaa4ef34351eaabbf04172950ad8e41328684bdb351c1af1c41331c</em:updateHash>
      </RDF:Description>
    </em:targetApplication>
  </RDF:Description>
</RDF:RDF>

futureFAvorit32
Попробуйте сверить с тем, что под спойлером ниже - это install.rdf и update.rdf от абсолютно стабильно апдейтящегося расширения. Причем нигде не используется https.

скрытый текст
Расширение, версия 0.0:

Выделить код

Код:

<?xml version="1.0"?>
<RDF:RDF xmlns:em="http://www.mozilla.org/2004/em-rdf#"
         xmlns:NC="http://home.netscape.com/NC-rdf#"
         xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <RDF:Description RDF:about="urn:mozilla:install-manifest"
                   em:id="{2ff1a7f6-ad47-4579-849a-89a90a91e9a9}"
                   em:type="2"
                   em:name="BarPrefs"
                   em:version="0.0"
                   em:creator="%20"
                   em:description="subj"
                   em:updateURL="http://dl.dropbox.com/u/14131025/testing/update.rdf"
                   em:updateKey="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBi........................">
    <em:targetApplication RDF:resource="rdf:#$6ztS.1"/>
  </RDF:Description>
  <RDF:Description RDF:about="rdf:#$6ztS.1"
                   em:id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"
                   em:minVersion="4.0b12"
                   em:maxVersion="5.*" />
</RDF:RDF>

Расширение, версия 1.0:

Выделить код

Код:

<?xml version="1.0"?>
<RDF:RDF xmlns:em="http://www.mozilla.org/2004/em-rdf#"
         xmlns:NC="http://home.netscape.com/NC-rdf#"
         xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <RDF:Description RDF:about="urn:mozilla:install-manifest"
                   em:id="{2ff1a7f6-ad47-4579-849a-89a90a91e9a9}"
                   em:type="2"
                   em:name="BarPrefs"
                   em:version="0.1"
                   em:creator="%20"
                   em:description="subj"
                   em:updateURL="http://dl.dropbox.com/u/14131025/testing/update.rdf"
                   em:updateKey="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQ.....................................................">
    <em:targetApplication RDF:resource="rdf:#$6ztS.1"/>
  </RDF:Description>
  <RDF:Description RDF:about="rdf:#$6ztS.1"
                   em:id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"
                   em:minVersion="4.0b12"
                   em:maxVersion="5.*" />
</RDF:RDF>

update.rdf для апдейта версии 0.0 на 1.0:

Выделить код

Код:

<?xml version="1.0"?>
<RDF:RDF xmlns:em="http://www.mozilla.org/2004/em-rdf#"
         xmlns:NC="http://home.netscape.com/NC-rdf#"
         xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <RDF:Description RDF:about="rdf:#$Wfjs52"
                   em:version="1.0">
    <em:targetApplication RDF:resource="rdf:#$Zfjs52"/>
  </RDF:Description>
  <RDF:Description RDF:about="rdf:#$Zfjs52"
                   em:id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"
                   em:minVersion="4.0b8pre"
                   em:maxVersion="5.*"
                   em:updateLink="http://dl.dropbox.com/u/14131025/testing/barprefs_new.xpi"
                   em:updateHash="sha1:ff5648cfe1de270cf935d54a4363fc3fd720c19e" />
  <RDF:Seq RDF:about="rdf:#$Vfjs52">
    <RDF:li RDF:resource="rdf:#$Wfjs52"/>
  </RDF:Seq>
  <RDF:Description RDF:about="urn:mozilla:extension:{2ff1a7f6-ad47-4579-849a-89a90a91e9a9}"
                   em:signature="MIGTMA0GCSqGSIb3DQEBDQUAA4...........................................">
    <em:updates RDF:resource="rdf:#$Vfjs52"/>
  </RDF:Description>
</RDF:RDF>


Расширение версии 0.0 находится здесь: http://dl.dropbox.com/u/14131025/testin … fs_old.xpi; версия 1.0 - на том же ресурсе. Расширение тестовое, и не содержит ничего, кроме настроек. Делалось все с помощью McCoy.
Ну, и загляните вот сюда: https://developer.mozilla.org/en/Extens … patibility - мало ли, вдруг найдёте то, что упустили или забыли.

hydrolizer пишет

Расширение версии 0.0 находится здесь: http://dl.dropbox.com/u/14131025/testin … fs_old.xpi; версия 1.0 - на том же ресурсе. Расширение тестовое, и не содержит ничего, кроме настроек. Делалось все с помощью McCoy.

Да, с McCoy всё пашет.

hydrolizer пишет

Ну, и загляните вот сюда: https://developer.mozilla.org/en/Extens … patibility - мало ли, вдруг найдёте то, что упустили или забыли.

В таком формате и в таком https://developer.mozilla.org/en/install_manifests с ключами McCoy тоже всё работает.

Итог исследований обновления показал:
HTTP+Hash - не работает.
HTTPS+Hash - не работает.
HTTP+McCoy+Hash - работает.

ЗЫ: install.rdf должен иметь в em:updateURL HTTPS-ссылку или иметь ключи созаны McCoy, иначе расширение не ставиться (на Firefox 4.*).

futureFAvorit32 пишет

HTTP+McCoy+Hash - работает

По данной выше ссылке написано же:

Gecko 1.9 has added additional requirements designed to protect users from man-in-the-middle attacks and the like during add-on updates. In the install.rdf of the already installed add-on updateURL must be specified in one of the following ways:

    The updateURL uses https, or there is no updateURL at all (which defaults to addons.mozilla.org which is https)
    The updateURL uses http and the updateKey entry is specified which will be used to verify the data in the update manifest.

When you specify an updateKey in the install.rdf, you must include a digital signature in the update manifest or the information will be rejected.

Вот этот updateKey с его digital signature и включается в манифесты с помощью McCoy. А сама эта сигнатура является base-64 encoded открытой частью RSA-ключа.
Что же до хэша, то это просто для контроля целостности файла слитого обновления.