McCoyでem:signatureが入らない問題解決

さぁ、McCoyをはじめよう!!Latest topics > XML署名とハッシュを使って安全な方法でアドオンを更新できるようにする – outsider reflexを参考にupdate.rdfに署名を入れようとするものの、McCoyでsignを押すと黙って処理が完了するもののちっとも署名が入らなくてずっと困っていました。

けっきょく

<?xml version="1.0" encoding="utf-8"?>
<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="extensionName@ido.nu">

の部分が正しくないのが原因でした。

urn:mozilla:extension:extensionName@ido.nu

と書かないといけません。書き換えたら解決。
いやそれ誰も間違ってないから、というかんじですが。

これでFirefox3でもちゃんと拡張機能をアップデートできるようになったけど、インストールのときに赤文字で表示されてるunsignedっていうのはどうやったらsignedになるんだろう。

ちなみにXSLTプロセッサのxsltprocがべんりで書いたやつをちょっと修正して、いまは

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
  xmlns:em="http://www.mozilla.org/2004/em-rdf#"
  xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
>
  <xsl:output method="xml" encoding="utf-8" indent="yes"/>
  <xsl:template match="/">
<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>
      <xsl:attribute name="about"><xsl:value-of select="concat('urn:mozilla:extension:',//RDF:Description[@RDF:about='urn:mozilla:install-manifest']/@em:id)"/></xsl:attribute>
      <em:updates>
        <RDF:Seq>
          <RDF:li>
            <RDF:Description>
              <em:version><xsl:value-of select="//RDF:Description[@RDF:about='urn:mozilla:install-manifest']/@em:version"/></em:version>
              <em:targetApplication>
                <RDF:Description>
                  <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
                  <em:minVersion><xsl:value-of select="//RDF:Description/@em:minVersion"/></em:minVersion>
                  <em:maxVersion><xsl:value-of select="//RDF:Description/@em:maxVersion"/></em:maxVersion>
                  <em:updateLink><xsl:value-of select="concat( substring-before(//RDF:Description/@em:updateURL,'update.rdf'), '*')"/></em:updateLink>
                  <em:updateHash>*</em:updateHash>
                </RDF:Description>
              </em:targetApplication>
            </RDF:Description>
          </RDF:li>
        </RDF:Seq>
      </em:updates>
    </RDF:Description>
</RDF:RDF>
  </xsl:template>
</xsl:stylesheet>

こういうXSLTをperlで書いたスクリプトでxsltprocを通してその結果を置換して作っています。xsltprocにもうひとつXMLファイルを読ませてXSLTだけで完結させられるんだと思うけどわからないのでとりあえず…

#!/usr/bin/perl
use Digest::SHA1;
my $filename = shift;
open F, "<$filename";
my $sha1 = Digest::SHA1->new();
$sha1->addfile(*F);
my $digest = $sha1->hexdigest;
my @result = qx{xsltproc style.xsl install.rdf};
foreach ( @result ) {
  /(em:updateHash)/ and s/\*/sha1:$digest/;
  /(em:updateLink)/ and s/\*/$filename/;
  print;
}

Makefile

update.rdf:style.xsl install.rdf $(XPIFILE)        ./sign $(XPIFILE) > update.rdf

というのを書いといて

make update.rdf

でupdate.rdfがアップデートされるようにしてます。


About this entry