mozilla
Your Search Results

    MCD, Mission Control Desktop AKA AutoConfig

    この文書では、Mozilla Suite 1.x.x、Firefox、Thunderbirdで利用可能な、集中管理による AutoConfig (自動設定) の具体例を解説します。

    【訳注: 以下の内容は、読みやすさと資料性を高めるために、英語の原文に比べて大幅に構成や内容が変更されています。日本語版のみに追記された詳細な情報も含まれており、英語の原文の忠実な翻訳ではないことに注意してください。】

    状況

    この文書の最初のバージョンが書かれた当時、INT-Evry では、研究室やセルフサービスのパソコン室で共有のコンピュータを利用している、約 2000 人のユーザ (主に学生) を管理していました。共有のコンピュータということで、1 日中何人ものユーザが 1 台のコンピュータを利用しています。これらのコンピュータは Windows XP と Linux ディストリビューションのひとつである Fedora Core 4/5 のデュアルブートになっています。ユーザは全員、Windows サーバの個人アカウントと、Linux 認証のための LDAP アカウントを持っています。

    目的

    私たちの目的は、コンピュータにその都度ログインする特定のユーザに対して、起動時に自動設定されたメールクライアントや Web ブラウザ、ニュースリーダーを提供することでした。Mozilla 製品を導入したことで、Windows と Unix (私たちの場合は Linux) どちらを起動しても同じプログラムを利用できるようになりました。

    INT-Evry では、ユーザ固有の設定ファイル (~/.mozilla/default/randomdir/prefs.js) で設定を行う代わりに、各ユーザの初期設定を集中管理しています。集中管理のための設定ファイル(以下、AutoConfigファイル)を使えば、環境変数 (USERHOME など) や LDAP クエリ (メールアドレスやコモンネームなどの参照に利用) を元にして、設定項目のロック (lockPref) や初期化 (defaultPref) を行うことが可能です。

    AutoConfigファイル

    Mozilla製品の集中管理機能は JavaScript ファイルを通じて利用します。

    設定の定義方法

    この集中管理設定ファイルは、私たちが必要なことを可能にする JavaScript API を利用しています。MOZILLA_HOME/default/autoconfig/prefcalls.js で定義されている以下の関数が利用可能です。詳細は prefcalls.js ファイルをご覧ください。

    function getPrefBranch() 
    function pref(prefName, value) 
    function defaultPref(prefName, value)
    function lockPref(prefName, value) 
    function unlockPref(prefName) 
    function getPref(prefName) 
    function clearPref(prefName)
    function getLDAPAttributes(host, base, filter, attribs) 
    function getLDAPValue(str, key) 
    function displayError(funcname, message)
    function getenv(name) 
    

    具体的な利用例は後述します。

    AutoConfigファイルの設置

    AutoConfigファイルは、アプリケーションディレクトリ(MOZILLA_HOME)のみに置く方法と、アプリケーションディレクトリと任意の置き場所(リモートのサーバ上を含む)の両方に置く方法の、二通りの方法で設置できます。リモートのサーバ上にだけ設置することはできません。

     

    アプリケーションディレクトリに置く AutoConfig ファイル

    AutoConfig ファイルは、任意の名前の JavaScript ファイルです。読み出しと実行権限を付けた上で MOZILLA_HOME ディレクトリに置きます。

    ただし、ファイルを置いただけでは内容は読み込まれません。このファイルを AutoConfig ファイルとして認識させるには、設定項目 general.config.filename で AutoConfig ファイルの名前を指定する必要があります。MOZILLA_HOME/default/pref/all.js または MOZILLA_HOME/greprefs/all.js などの既存の設定ファイルの末尾に、pref("general.config.filename", "mozilla.cfg"); のように追記するか、all.js などと同じ位置に新しい設定ファイルを作成してその中に記述してください。

    設定項目 general.config.filename によって示された名前のファイルが MOZILLA_HOME ディレクトリに無い場合や、ファイルの読み出しに失敗した場合、Mozilla アプリケーションはエラーメッセージを表示して強制終了します。

    また、設定項目 general.config.vendor によってベンダ名が示されていた場合は、 general.config.filename で示されたファイルのファイル名部分(拡張子 .cfg を除いた部分)とが一致しない場合にも、同様のエラーメッセージが表示され Mozilla アプリケーションが強制終了します。この設定項目はセキュリティを高めるために利用できます。

    // これはOK
    pref("general.config.filename", "mozilla.cfg");
    pref("general.config.vendor", "mozilla");
    
    // これはNG
    pref("general.config.filename", "mozilla.cfg");
    pref("general.config.vendor", "mycompany");
    

    このファイルの1行目は読み込み時に必ず無視される事に注意して下さい。1行目にディレクティブを記述しても、読み込み時には無視されます。1行目は必ずコメント行として、ディレクティブは2行目以降に記述して下さい。

    // 1行目:この行は評価されない
    pref("mail.startup.enabledMailCheckOnce", false); // 2行目:この行以降は評価される
    
    AutoConfig ファイルのエンコード

    古い Netscape 4.x では、難読化などのために、AutoConfig ファイル (netscape.cfg) の内容は必ずエンコード(バイトシフト・ロータリーは 7)する必要がありました。Firefox や Thunderbird などの現在の Mozilla アプリケーションでは、標準のバイトシフトは 13 ですが、バイトシフトは設定項目 general.config.obscure_value によって任意の値に変更することができます。pref("general.config.obscure_value", 0);all.js などに記述することで、エンコードされていない AutoConfig ファイルを利用することもできます。ただしその場合、AutoConfig ファイルの 1 行目はコメントアウトにする必要があります。

    ファイルのエンコードには、http://www.alain.knaff.lu/howto/Mozi...z-byteshift.pl にある moz-byteshift.pl という Perl スクリプトが利用可能です。moz-byteshift.pl の利用方法は以下の通りです。

    $ more moz-byteshift.pl
    #!/usr/bin/perl
     
    # Mozilla の netscape.cfg ファイル用のバイトシフトプログラム
     
    # 古い Netscape 4.x ではバイトシフト 7 を使用
    #   To decode: moz-byteshift.pl -s -7 <netscape.cfg >netscape.cfg.txt
    #   To encode: moz-byteshift.pl -s  7 <netscape.cfg.txt >netscape.cfg
     
    # Mozilla ではバイトシフト 13 を使用
    #   To decode: moz-byteshift.pl -s -13 <netscape.cfg >netscape.cfg.txt
    #   To encode: moz-byteshift.pl -s  13 <netscape.cfg.txt >netscape.cfg
     
    $ ./moz-byteshift.pl -s 13 < mci-mozilla-web-tux.js > mci-mozilla-web-tux.cfg
    

    エンコード/デコードを行うユーティリティをJavaScriptで実装する場合は以下のようになります。

    var encoded = script
                   .split('')
                   .map(function(aChar) {
                     return String.fromCharCode(
                       aChar.charCodeAt(0) + 13
                     );
                   })
                   .join('');
    var decoded = encoded
                   .split('')
                   .map(function(aChar) {
                     return String.fromCharCode(
                       aChar.charCodeAt(0) - 13
                     );
                   })
                   .join('');


    Netscape 4.x 用であれば、Client Customization Kit (CCK) に付属しているコンバート機能でも同様にエンコードできます (CCK では自動インストールのカスタマイズなども可能です)。詳しくは http://developer.netscape.com/docs/manuals/deploymt/config.htm をご覧ください。

    リモートのサーバ上に置く AutoConfig ファイル

    AutoConfig ファイルによる設定を更新するためには、すべてのクライアントにインストールされた AutoConfig ファイルを一つ一つ更新する必要があります。しかし頻繁に変更される可能性がある設定情報をこの方法で提供するのは現実的ではありません。そこで、Mozilla アプリケーションでは、もう一つ追加の AutoConfig ファイルをリモートに設置することができます。これによって、サーバ上にある一つのファイルを更新するだけで、すべてのクライアントに変更を適用することができます。

    リモートのサーバ上に置いた AutoConfig ファイルの位置は、設定項目 autoadmin.global_config_url で指定します。all.js などに pref("autoadmin.global_config_url", "http://server/auto-config-file.jsc"); のように追記するか、MOZILLA_HOME ディレクトリに置いた AutoConfig ファイルの中でlockPref("autoadmin.global_config_url", "http://server/auto-config-file.jsc"); のように記述してください。File URLを使って、HTTPサーバではなくファイルサーバの共有フォルダなどに置かれたファイルを参照することもできます。

    リモートに設置した AutoConfig ファイルは、MOZILLA_HOME ディレクトリに置いた AutoConfig ファイルが利用されている状況でのみ読み込まれることに注意してください。autoadmin.global_config_url の値自体は AutoConfig ファイルで設定しても通常の .js ファイルで設定してもどちらでも構いませんが、ローカルの AutoConfig ファイルが利用されていない状況では、autoadmin.global_config_url で指定されたリモートの AutoConfig ファイルを読み込む処理自体がスキップされます。

    ローカルに設置する AutoConfig ファイルとは異なり、リモートに設置する AutoConfig ファイルはエンコードは常に不要です。ファイルの拡張子としては .jsc が利用されることが多いようです。静的ファイルを設置する以外に、CGI スクリプトなどによって動的に生成させることもできます。その場合、送信するファイルの Content-Type は application/x-javascript-config などとなります。AutoConfig ファイルを自動的に生成する CGI スクリプトの例は、この文書の後半の参考資料をご覧下さい。

    Thunderbirdでの利用例

    Thunderbird での AutoConfig と LDAP 呼び出しのサポート

    Thunderbird 1.5 以降(2.0以降も含めて)の標準のビルドでは、AutoConfig と LDAP 呼び出しが共に利用可能です(参考:バグ 295329)。標準の configure スクリプトに、MOZ_LDAP_XPCOM=1MOZ_EXTENSIONS_DEFAULT="wallet spellcheck xmlextras pref webservices universalcharset auth" が含まれていない古い Thunderbird 1.0.x でこれらの機能を利用するには、再コンパイルする必要があります。

    AutoCongig の設定

    これが、Thunderbird の起動時に AutoConfig を利用させる 2 つのディレクティブです。

    [root@b008-02 /usr/lib/thunderbird-1.5]
    $tail -2 greprefs/all.js
    pref("general.config.obscure_value", 0); // MCD の .cfg ファイル用
    pref('general.config.filename', 'thunderbird.cfg'); // MCD の .cfg ファイル用
    

    最初の 1 行は、ただファイルをエンコードしないことを宣言するものです (通常は 13 または 7 です)。2 行目は、読み込むファイルの名前です。この例では /usr/lib/thunderbird-1.5/thunderbird.cfg になります。

    AutoConfig で使用するディレクティブ

    ここでは、各ユーザ共通のメール設定を行います。ユーザのログイン名からアカウントを作成し、LDAP リクエストからメールアドレスを取得、それから IMAP と SMTP サーバを設定します。これにより、マルチユーザのワークステーション上でも、各ユーザは自分用に自動設定された Thunderbird を利用できるようになります。

    thunderbird.cfg

    以下が完全なファイルです。最初に環境変数からユーザのログイン名を取得し、それから LDAP アドレス帳の設定、メールアカウントの作成、IMAP と SMTP サーバの設定を行っています。

    [root@b008-02 /usr/lib/thunderbird-1.5]
    $ cat thunderbird.cfg
    // このスクリプトの1行目は評価されないので、必ずコメント行にします
    
    // すべての行を try/catch 文に含めます
    try {
    
    // 1) 環境変数
    if(getenv("USER") != "") {
      // *NIX 用の設定
      var env_user = getenv("USER");
      var env_home = getenv("HOME");
    } else {
      // Windows 用の設定
      //   Windows 環境では、<code>USER</code> や <code>HOME</code> といった
      //   環境変数は、<code>USERNAME</code> や <code>HOMEPATH</code> になります。
      var env_user = getenv("USERNAME");
      var env_home = getenv("HOMEPATH");
    }
    var env_mozdebug= getenv("MOZILLA_DEBUG");
    // var env_user = prompt("indiquez votre login", toto);
    
    // 2) 一般的な設定をロック
    // LDAP アドレス帳
    lockPref("ldap_2.prefs_migrated", true);
    lockPref("ldap_2.servers.LDAPINT.auth.savePassword", true);
    lockPref("ldap_2.servers.LDAPINT.description", "LDAP INT");
    lockPref("ldap_2.servers.LDAPINT.filename", "abook-1.mab");
    lockPref("ldap_2.servers.LDAPINT.uri", "ldap://ldap1.int-evry.Fr:389/ou=people,dc=int-evry,dc=fr??sub");
    lockPref("ldap_2.servers.history.filename", "history.mab");
    lockPref("ldap_2.servers.history.replication.lastChangeNumber", 0);
    lockPref("ldap_2.servers.pab.filename", "abook.mab");
    lockPref("ldap_2.servers.pab.replication.lastChangeNumber", 0);
    
    // アカウント
    lockPref("mail.account.account1.server", "server1");
    lockPref("mail.account.account2.identities", "id1");
    lockPref("mail.account.account2.server", "server2");
    lockPref("mail.accountmanager.accounts", "account1,account2");
    lockPref("mail.accountmanager.defaultaccount", "account2");
    lockPref("mail.accountmanager.localfoldersserver", "server1");
    lockPref("mail.identity.id1.directoryServer", "ldap_2.servers.LDAPINT");
    lockPref("mail.identity.id1.draft_folder", "imap://" + env_user + "@imap-int.int-evry.fr/Drafts");
    lockPref("mail.identity.id1.drafts_folder_picker_mode", "0");
    lockPref("mail.identity.id1.fcc_folder", "imap://" + env_user + "@imap-int.int-evry.fr/Sent");
    lockPref("mail.identity.id1.fcc_folder_picker_mode", "0");
    lockPref("mail.identity.id1.organization", "INT Evry France");
    lockPref("mail.identity.id1.overrideGlobal_Pref", true);
    lockPref("mail.identity.id1.reply_to", "");
    
    // IMAP
    lockPref("mail.server.server2.hostname", "imap-int.int-evry.fr");
    lockPref("mail.server.server2.isSecure", true);
    lockPref("mail.server.server2.login_at_startup", true);
    lockPref("mail.server.server2.max_cached_connections", 5);
    // lockPref("mail.server.server2.name", "jehan.procaccia@int-evry.fr");
    lockPref("mail.server.server2.type", "imap");
    lockPref("mail.server.server2.userName", env_user);
    
    // SMTP
    lockPref("mail.identity.id1.smtpServer", "smtp1");
    lockPref("mail.identity.id1.stationery_folder", "imap://" + env_user + "@imap-int.int-evry.fr/Templates");
    lockPref("mail.identity.id1.tmpl_folder_picker_mode", "0");
    lockPref("mail.identity.id1.valid", true);
    
    // SMTP 一般設定
    lockPref("mail.smtp.defaultserver", "smtp1");
    lockPref("mail.smtpserver.smtp1.auth_method", 0);
    lockPref("mail.smtpserver.smtp1.hostname", "smtp-int.int-evry.fr");
    lockPref("mail.smtpserver.smtp1.port", 25);
    lockPref("mail.smtpserver.smtp1.try_ssl", 0);
    lockPref("mail.smtpserver.smtp1.username", "");
    lockPref("mail.smtpservers", "smtp1");
    lockPref("mail.startup.enabledMailCheckOnce", true);
    lockPref("mailnews.quotingPrefs.version", 1);
    lockPref("mailnews.ui.threadpane.version", 5);
    
    /* 3) ここで定義しておく (下の 4 以降では機能しないため) processLDAPValues() は、
          後で直下の getLDAPAttributes() によって呼び出されます。
          $MOZILLA_HOME/defaults/autoconfig/prefcalls.js で定義されている
          getLDAPAttributes() コードを参照すれば、「ユーザ定義」された
          processLDAPValues() への内部呼び出しを確認できます
    */
    function processLDAPValues(values) {
      if(values) {
        // LDAP クエリから返ってきた値でグローバル変数をセットします
        ldap_values = values;
        var uid = getLDAPValue(values, "uid");
        var cn = getLDAPValue(values, "cn");
        var mail = getLDAPValue(values, "mail");
        var URL = getLDAPValue(values, "labeledURI");
    
    // これらの LDAP 変数は、この processLDAPValues 関数内部でしか使用できません。
    // そのため、ここで必要な設定項目を記述しておきます
    lockPref("mail.identity.id1.useremail", mail);
    lockPref("mail.server.server2.name", mail);
    lockPref("mail.identity.id1.fullName", cn);
    // ポップアップによるエラーメッセージを使ったデバッグが使えなくなってしまいました
    var env_mozdebug= getenv("MOZILLA_DEBUG");
    if (env_mozdebug) {displayError("エラーはありませんでした。これはデバッグ用です。cn は " + cn + "、mail は " + mail); }
        }
      }
    // 4) LDAP サーバを呼び出し、LDAP 属性 (mail と cn) を取得します。
    //    これは最終的に上記 3 の processLDAPValues() を呼び出します
      getLDAPAttributes("ldap2.int-evry.fr","ou=people,dc=int-evry,dc=fr","uid=" + env_user,"uid,cn,mail,labeledURI");
    
    // try 文を閉じて catch 文を呼び出します
    } catch(e) {
      displayError("lockedPref", e);
    }
    
    AutoConfig のテスト
    デバッグ

    AutoConfig が問題なく機能することを確認するため、環境変数を設定し、thunderbird.cfg ファイルの読み込みを監視しました。

    $ export NSPR_LOG_MODULES=MCD:5
    $ export NSPR_LOG_FILE=/tmp/thunderbird-log.txt
    

    Thunderbird が起動すると、次のような出力が見られるはずです。

     $ cat /tmp/thunderbird-log.txt
    -1209403040[808a788]: general.config.filename = thunderbird.cfg
    -1209403040[808a788]: evaluating .cfg file thunderbird.cfg with obscureValue 0
    
    初期化

    次に、必ず新しい Thunderbird のアカウントで起動します。すでにアカウントが存在していて、メールと設定を残したい場合は、この行は飛ばしてください。

    $ rm -rf ~/.thunderbird
    
    起動
    $ thunderbird
    

    インストールされているメールクライアントに応じて、Netscape や Mozilla からプロファイルをインポートするかどうか Thunderbird が聞いてきた場合は、何もインポートせず、AutoConfig だけを実行させてください。

    これでうまくいくはずです。複数ユーザの AutoConfig を動作確認するには、異なる USER 変数 (USER=procacciUSER=test など、LDAP ディレクトリに存在するユーザの誰か) を設定してプロセスを再起動します。

     

    Firefox での利用例

    原理は上で説明した Thunderbird と同じです。バイナリディストリビューションには AutoConfig (pref 拡張) が含まれていますが、残念ながら LDAP 呼び出しのサポートが含まれていません (参考: MOZ_LDAP_XPCOM=1)。私たちの場合、環境変数では通常利用できない、コモンネームとメールアドレスの取得によるメールアカウントの設定を行うため、Thunderbird では必要でしたが、Firefox では必須ではありませんでした。ただし、標準のホームページをユーザの LDAP 属性 labeledURI に設定するなど、Firefox の追加設定のために LDAP の値を取得できると便利かもしれません。

    AutoConfig と LDAP のサポート

    Firefox への LDAP サポートの追加

    Firefox 1.0.x から 3.0 までのすべての Firefox の標準ビルドには、 LDAP のサポート (MOZ_LDAP_XPCOM=1) は含まれていません。LDAP のサポートを含めるには再コンパイルする必要があります。mozconfig ファイルを編集し、--disable-ldap を削除します。Firefox がどのようなオプションでコンパイルされているかは about:buildconfig を見ると確認できます (Thunderbird で同じことをする方法は分かりません。どのようにコンパイルされているのでしょうか)。詳しくは バグ 295329 をご覧ください。

    また、Firefox 1.0.x では pref 拡張自体も有効にして再コンパイルする必要があります。mozconfig ファイルを編集し、pref 拡張 (--enable-extensions=pref) を追加してください。この作業は Firefox 1.5 以降では不要です。

    about:buildconfig
    
    Build platform
    target
    i686-pc-linux-gnu
    
    Build tools
    Compiler Version Compiler flags
    gcc gcc version 3.4.3 20050227 (Red Hat 3.4.3-22.fc3) -Wall -W -Wno-unused -Wpointer-arith -Wcast-align -Wno-long-long -pedantic -pthread -pipe
    c++ gcc version 3.4.3 20050227 (Red Hat 3.4.3-22.fc3) -fno-rtti -fno-exceptions -Wall -Wconversion -Wpointer-arith -Wcast-align -Woverloaded-virtual -Wsynth -Wno-ctor-dtor-privacy -Wno-non-virtual-dtor -Wno-long-long -pedantic -fshort-wchar -pthread -pipe -I/usr/X11R6/include
    
    Configure arguments
    --disable-mailnews --enable-extensions=cookie,xml-rpc,xmlextras,pref,transformiix,universalchardet,webservices,inspector,gnomevfs,negotiateauth --enable-crypto --disable-composer --enable-single-profile --disable-profilesharing --with-system-jpeg --with-system-zlib --with-system-png --with-pthreads --disable-tests --disable-jsd --disable-installer '--enable-optimize=-Os -g -pipe -m32 -march=i386 -mtune=pentium4' --enable-xft --enable-xinerama --enable-default-toolkit=gtk2 --enable-official-branding --disable-xprint --disable-strip --enable-pango 
    

    all.js

    [root@b008-02 /usr/lib/firefox-1.5.0.2]
    $tail -4 greprefs/all.js
    // AutoConfig jehan
    pref('general.config.obscure_value', 0);
    pref('general.config.filename', 'firefox.cfg');
    

    firefox.cfg

    このファイルでは、ブラウザのホームページを、ユーザの LDAP エントリーで定義された labeledURI に設定しています。これにより、AutoConfig と LDAP が両方機能することを確認できます。

    [root@b008-02 /usr/lib/firefox-1.5.0.2]
    $cat firefox.cfg
    // すべての行を try/catch 文に含めます
    try {
    
    // プライバシーとセキュリティ
    defaultPref("signon.rememberSignons", false);
    
    // 1) 環境変数
    if(getenv("USER") != "") {
      // *NIX 用の設定
      var env_user = getenv("USER");
      var env_home = getenv("HOME");
    } else {
      // Windows 用の設定
      var env_user = getenv("USERNAME");
      var env_home = getenv("HOMEPATH");
    }
    var env_mozdebug = getenv("MOZILLA_DEBUG");
    
    /* 2) ここで定義しておく (下の 3 以降では機能しないため) processLDAPValues() は、
          後で直下の getLDAPAttributes() によって呼び出されます。
          $MOZILLA_HOME/defaults/autoconfig/prefcalls.js で定義されている
          getLDAPAttributes() コードを参照すれば、「ユーザ定義」された
          processLDAPValues() への内部呼び出しを確認できます。
    */
    function processLDAPValues(values) {
      if(values) {
        // LDAP クエリから返ってきた値でグローバル変数をセットします
        ldap_values = values;
        var uid = getLDAPValue(values, "uid");
        var cn = getLDAPValue(values, "cn");
        var mail = getLDAPValue(values, "mail");
        var URL = getLDAPValue(values, "labeledURI");
    // ポップアップによるエラーメッセージを使ったデバッグが使えなくなってしまいました
    var env_mozdebug= getenv("MOZILLA_DEBUG");
    if (env_mozdebug) {displayError("エラーはありませんでした。これはデバッグ用です。cn は " + cn + "、mail は " + mail + "、labeledURI は " + URL); }
    lockPref("browser.startup.homepage", URL);
        }
      }
    
    //lockPref("browser.startup.homepage", "http://www.renater.fr/");
    // 3) LDAP サーバを呼び出し、LDAP 属性 (mail と cn) を取得します。
    //    これは最終的に上記 2 の processLDAPValues() を呼び出します
      getLDAPAttributes("ldap2.int-evry.fr","ou=people,dc=int-evry,dc=fr","uid=" + env_user,"uid,cn,mail,labeledURI");
    
    // try 文を閉じて catch 文を呼び出します
    } catch(e) {displayError("lockedPref", e);}
    

    デバッグ

    ユーザ名と MOZILLA_DEBUG 変数を設定した場合 ($export MOZILLA_DEBUG=1; export USER=procacci)、displayError() によってこのようなポップアップウィンドウが表示されます。

    Image:mozilla-autoconfig-en001.png

    これは「警告」というタイトルのウィンドウですが、ただのデバッグツールであって、他にポップアップで情報を表示する方法は確認できていません。詳しくは バグ 206294 のコメントをご覧ください。

     ------- Comment #14 From Daniel Wang 2003-11-06 09:06 PDT [reply] -------
    
    Jehan Procaccia, you need to change 5.8 to reflect what I said in comment 21.
    
    Preference files and config files are special JavaScript files with limited scopes. They
    can only call the get/set pref/env methods and have no access to other objects
    (need to investigate what exactly are allowed). alert() is a method of the
    Window object.
    

    また、ニュースグループ mozilla.dev.tech.js-engine にも同様の投稿がありました。

    Date: Wed, 17 May 2006 19:06:28 +0200
    From: jehan procaccia <jehan.procaccia@int-evry.fr>
    
    Newsgroups: mozilla.dev.tech.js-engine
    Subject: scope of js file functions in Frefox/Thunderbird AutoConfig context
    

     

    AutoConfig の利用上の注意

    設定の変更・削除

    pref()lockPref() の各ディレクティブによって設定された値はユーザプロファイル内の prefs.js にも保存されます(これは user.js を使用した場合の挙動によく似ています)。よって、これらのディレクティブによって値を設定している箇所を AutoConfig ファイルから削除しただけでは、古い設定値が依然として残ったなままとなることに注意してください。

    設定項目 autoadmin.global_config_url によってリモートの AutoConfig ファイルを利用していた場合、autoadmin.global_config_url の示していたURLが prefs.js に保存されます。そのため、 autoadmin.global_config_url を設定している箇所をローカルの AutoConfig ファイルから削除しても、ユーザープロファイル内に残った設定値によって、リモートの AutoConfig ファイルが参照され続けてしまうことになります。

    古い設定や不要になった設定を無効化し、上記のようなトラブルが起こってしまうことを防ぐには、 lockPref("autoadmin.global_config_url", "") などのように値を上書きするか、clearPref("autoadmin.global_config_url") のようにclearPref()ディレクティブを使用して明示的に値を削除する必要があります。

    プロファイル内のprefs.jsにはデフォルト設定からの変更点のみが保存されるため、原則として、defaultPref()を使用して設定された値はプロファイル内のprefs.jsには保存されません。ただし、lockPref()ディレクティブを使用してデフォルト値と同じ値でロックをかけた場合、その値はプロファイル内のprefs.jsに保存される場合があります。

    AutoConfig ファイルのキャッシュ

    設定項目 autoadmin.global_config_url によって指定されたリモートの AutoConfig ファイルの内容は、ユーザープロファイル内に failover.jsc としてキャッシュされます。

    このキャッシュファイルは、サーバの障害やリモートの AutoConfig のエラーなどによって AutoConfig ファイルの読み込みに失敗した際に利用されます。設定項目 autoadmin.offline_failover を明示的に true に設定している場合、オフライン時にもこのキャッシュファイルが使用されます。

    キャッシュファイルの利用を禁止するには、設定項目 autoadmin.failover_to_cached の値として false を設定して下さい。キャッシュファイルの利用が禁止されている場合、リモートの AutoConfig ファイルの読み込みに失敗した際は、Mozilla アプリケーションは強制的にオフラインモードとなります。

    設定の読み込まれる順番と優先順位

    AutoConfig ファイルを利用している環境で、おのおのの方法によって設定された設定値は、ユーザプロファイル内に設定が全く保存されていない新規プロファイルで起動した場合は以下の優先順位で反映されます。

    1. MOZILLA_HOME/defaults/pref/*.js での初期設定値:最も優先順位が低い
    2. 各アドオンの defaults/preferences/*.js での初期設定値
    3. ローカルの AutoConfig ファイル(MOZILLA_HOME/*.cfg)において、defaultPref()ディレクティブで設定された値
    4. リモートの AutoConfig ファイルにおいて、defaultPref()ディレクティブで設定された値
    5. ユーザプロファイル内のprefs.jsに保存された設定値
    6. user.jsで設定された値
    7. ローカルの AutoConfig ファイルにおいて、pref()ディレクティブで設定された値
    8. リモートの AutoConfig ファイルにおいて、pref()ディレクティブで設定された値
    9. ローカルの AutoConfig ファイルにおいて、lockPref()ディレクティブで設定された値
    10. リモートの AutoConfig ファイルにおいて、lockPref()ディレクティブで設定された値:最も優先順位が高い

    AutoConfig による設定が意図通りに働かないケース

    設定が読み込まれる順番次第で、ユーザの設定が失われる場合があります。

    例えばローカルの AutoConfig に defaultPref("dom.disable_open_during_load", false); という記述がある場合、これは、通常はtrueが初期値となっている dom.disable_open_during_load の初期値をfalseに設定し、ユーザが任意にtrueに変更できるようにする、という風な結果を想定したものと考えられます。

    しかし実際には、ユーザが設定値をtrueに変更した場合、次回の Firefox 起動時には以下のような現象が起こります。

    1. firefox.js によって dom.disable_open_during_load の初期値がtrueと定義される
    2. ユーザが変更した結果 prefs.js に保存されていた値 true が読み込まれる。これは初期値に等しいため、消去される。
    3. AutoConfig によって dom.disable_open_during_load の初期値がfalseと定義し直される

    つまりこの場合、ユーザが何度設定を変更してもFirefoxを起動し直す度に設定が失われてしまうという結果になります。

    AutoConfig は、このようなややこしい問題が起こらない場面に限定して利用するのが望ましいと言えるでしょう。ユーザが設定を変更できる状態で、設定の初期値だけを変更するといった用途には、アドオンの defaults\preferences\フォルダ内に置かれたJavaScriptファイルを使用するのが最も確実且つ安全と考えられます。

    リモートの AutoConfig ファイルの置き場所として指定できる URI

    設定項目 autoadmin.global_config_url の値として、前述の例では一般的な http: のURIを示しましたが、これ以外にも Mozilla アプリケーション自身が対応している形式の URI ( file:, ftp:, gopher: など)であればいずれも指定可能です。

    リモートの AutoConfig とプロキシ

    HTTPなどでアクセスするリモートの AutoConfig ファイルでプロキシの設定を行う場合、プロキシの設定がローカルに保存される点と、 AutoConfig ファイルへのアクセス自体にもプロキシが利用される点に注意して下さい。

    存在しないプロキシサーバを参照するよう設定してしまった場合や、前回 AutoConfig で設定されたプロキシサーバが利用できなくなってしまった場合、Mozilla アプリケーションは AutoConfig ファイル自体を取得できなくなってしまいます。

    このような問題を避けるには、 AutoConfig ファイルをファイル共有サーバに置いて File URL でアクセスする、などの方法が考えられます。

    関連情報

    AutoConfig に関する関連資料

    http://mit.edu/~firefox/www/maintain...utoconfig.html

    http://www.alain.knaff.lu/howto/Mozi...ion/index.html
    http://thegoldenear.org/toolbox/wind...re-config.html
    http://ilias.ca/blog/2005/03/locking...efox-settings/

    Windows でのコンパイル方法:
    http://forums.mozillazine.org/viewtopic.php?t=276014

    http://www.mozilla.org/community/dev...er-forums.html
    http://forums.mozillazine.org/viewto...config#2090731
    http://forums.mozillazine.org/viewto...config#1354355
    http://forums.mozillazine.org/viewto...toconfig#32783

    関連バグ

    バグ 295329
    バグ 222973
    バグ 225288
    バグ 178685
    バグ 272970
    バグ 206294
    バグ 302096

     

     

    参考資料

    古い Thunderbird 1.0.x への AutoConfig オプションの追加

    Thunderbird 1.0.x のバイナリディストリビューションには、標準では AutoConfig が含まれていません。おそらく、大半の個人ユーザが必要としない機能のために、バイナリの読み込み時間が長くなってしまうのを防ぐための措置だと思います。しかし、法人で導入する際には必須の機能です。そこで私たちは、AutoConfig サポートを付けて Thunderbird を再コンパイルしました。mozconfig ファイルに --enable-extensions=pref を追加するだけのことです。

    手元の Fedora Core 3 で、Thunderbird のソースパッケージ thunderbird-1.0.2-1.3.3.src.rpm を取得してインストール (rpm -i) し、/usr/src/redhat/SOURCES/thunderbird-mozconfig に以下の行を追加しました。

    ac_add_options --enable-extensions=pref
    

    それから、コンパイルとインストールを実行しました。

    $ rpmbuild -ba /usr/src/redhat/SPECS/thunderbird.spec
    $ rpm -Uvh /usr/src/redhat/RPMS/i386/thunderbird-1.0.2-1.3.3.i386.rpm
    

    インストール後、次のようにして AutoConfig が復活していることを確認しました。

    $ rpm -ql thunderbird | grep autoconfig
    /usr/lib/thunderbird-1.0.2/chrome/en-US/locale/autoconfig
    /usr/lib/thunderbird-1.0.2/components/autoconfig.xpt
    /usr/lib/thunderbird-1.0.2/components/libautoconfig.so
    /usr/lib/thunderbird-1.0.2/defaults/autoconfig
    /usr/lib/thunderbird-1.0.2/defaults/autoconfig/platform.js
    /usr/lib/thunderbird-1.0.2/defaults/autoconfig/prefcalls.js
    

     

    報告されている関連バグ

    参考として、古い 1.0.x リリースに存在する問題を挙げておきます。

    不要な空白の再発

    残念なことに、Thunderbird 1.0.2 で「空白バグ」が再発してしまいました。詳細は バグ 229271 をご参照ください。Mozilla のナイトリービルドでは 2004 年末に修正されていますが (mozilla/extensions/pref/autoconfig/src/nsLDAPSyncQuery.cpp 1.7.2.1)、少なくとも Thunderbird 1.0.2 には問題が存在します。このため、このバグで提案した回避策 (start_pos += 1;) を適用しました。

     

     

    CGI による Web ベースの JavaScript 設定ファイルの生成

    [root@corbeau /var/www/cgi-bin]
    $ cat mci-mozilla-glob-prefs-tux.cgi
    #!/usr/bin/perl -w
    
    print("Content-type: application/x-javascript-config\n\n");
    $page = <<"EOP";
     
    try {
      var env_user = getenv("USER");
      var env_home = getenv("HOME");
      var env_mozdebug= getenv("MOZILLA_DEBUG");
      function processLDAPValues(values) {
        var uid = getLDAPValue(values, "uid");
        var cn = getLDAPValue(values, "cn");
        var mail = getLDAPValue(values, "mail");
        lockPref("mail.server.server1.name", mail);
        lockPref("mail.identity.id1.fullName", cn);
        lockPref("mail.identity.id1.useremail", mail);
    
      if (env_mozdebug) {
        displayError("デバッグ mozilla.cfg v2.8", "mail: " + mail + " uid: " + uid + " cn: " + cn + " user: " + env_user);
      } 
    }
    // ブラウザ
    lockPref("browser.startup.homepage", "http://www.int-evry.fr/mci/user/");
    lockPref("browser.startup.homepage_override", true);
    lockPref("general.config.vendor", "mci-mozilla-web-tux");
    lockPref("startup.homepage_override_url", "http://www.int-evry.fr/mci/user/");
    lockPref("browser.cache.disk.capacity", 0);
    lockPref("network.cookie.cookieBehavior", 0);
    lockPref("network.proxy.autoconfig_url", "http://www.int-evry.fr/local/config.proxy");
    lockPref("network.proxy.type", 2);
     
    // アカウント
    lockPref("mail.account.account1.identities", "id1");
    lockPref("mail.account.account1.server", "server1");
    lockPref("mail.account.account2.server", "server2");
    lockPref("mail.account.account3.server", "server3");
    lockPref("mail.accountmanager.accounts", "account1,account2,account3");
    lockPref("mail.accountmanager.defaultaccount", "account1");
     
    // IMAP
    lockPref("mail.server.server1.hostname", "imap-int.int-evry.fr");
    lockPref("mail.server.server1.type", "imap");
    lockPref("mail.server.server1.login_at_startup", true);
    lockPref("mail.identity.id1.draft_folder", "imap://" + env_user + "@imap-int.int-evry.fr/Drafts");
    lockPref("mail.identity.id1.drafts_folder_picker_mode", "0");
    lockPref("mail.identity.id1.fcc_folder", "imap://" + env_user + "@imap-int.int-evry.fr/Sent");
    lockPref("mail.identity.id1.fcc_folder_picker_mode", "0");
    lockPref("mail.identity.id1.stationery_folder", "imap://" + env_user + "@imap-int.int-evry.fr/Templates");
    lockPref("mail.identity.id1.tmpl_folder_picker_mode", "0");
    lockPref("mail.identity.id1.valid", true);
    lockPref("mail.identity.id1.overrideGlobal_Pref", true);
    lockPref("mail.server.server1.download_on_biff", true);
    lockPref("mail.server.server1.login_at_startup", true);
    lockPref("mail.server.server1.userName", env_user);
    lockPref("mail.server.server1.delete_model", 0);
     
    // SMTP
    lockPref("mail.identity.id1.smtpServer", "smtp1");
    defaultPref("mail.smtpserver.smtp1.auth_method", 0);
    lockPref("mail.smtpservers", "smtp1");
    lockPref("mail.smtpservers", "smtp1");
    lockPref("mail.smtp.defaultserver", "smtp1");
    lockPref("mail.smtpserver.smtp1.hostname", "smtp-int.int-evry.fr");
    lockPref("mail.identity.id1.organization", "INT Evry France");
    lockPref("mail.startup.enabledMailCheckOnce", true);
    lockPref("mail.ui.folderpane.version", 3);
    lockPref("mailnews.ui.threadpane.version", 2);
     
    // LDAP 設定
    lockPref("mail.identity.id1.directoryServer", "ldap_2.servers.ldapint");
    lockPref("ldap_2.prefs_migrated", true);
    lockPref("ldap_2.servers.history.filename", "history.mab");
    lockPref("ldap_2.servers.history.replication.lastChangeNumber", 0);
    lockPref("ldap_2.servers.ldapint.auth.savePassword", true);
    lockPref("ldap_2.servers.ldapint.description", "ldap-int");
    lockPref("ldap_2.servers.ldapint.filename", "abook-1.mab");
    lockPref("ldap_2.servers.ldapint.position", 3);
    lockPref("ldap_2.servers.ldapint.uri", "ldap://ldap1.int-evry.fr:389/ou=people,dc=int-evry,dc=fr??sub");
    lockPref("ldap_2.servers.pab.filename", "abook.mab");
    lockPref("ldap_2.servers.pab.replication.lastChangeNumber", 0);
     
    // News 設定
    lockPref("mail.server.server3.hostname", "news.int-evry.fr");
    lockPref("mail.server.server3.max_cached_connections", 2);
    lockPref("mail.server.server3.name", "news.int-evry.fr");
    lockPref("mail.server.server3.type", "nntp");
    lockPref("mail.server.server3.userName", env_user);
     
    // LDAP サーバを呼び出してユーザ属性を取得
    getLDAPAttributes("ldap2.int-evry.fr", "ou=people,dc=int-evry,dc=fr", "uid=" +env_user, "uid,cn,mail");
     
    } catch(e) {
      displayError("lockedPref", e);
    }
     
    EOP
    print $page;
    

    Windows 特有の注意点

    Web ベースの CGI ファイルを使用しない場合、Windows では注意が必要です。エンコード前の AutoConfig ファイルの 1 行目は //BEGIN CE prefs としなければなりません。そうしないと「設定ファイルを正常に読み込めませんでした」というメッセージが表示され、Mozilla が起動しません。

    また、Windows 環境では、USERHOME といった環境変数は、USERNAMEHOMEPATH になります。AutoConfig ファイル内で環境変数を参照する場合は注意してください。

    if... else 形式のテストで、例えば USERUSERNAME のように、Linux と Windows どちらの環境変数を使うべきか判別することができます。

    // 1) 環境変数
    if(getenv("USER") != "") {
       // *NIX 用の設定
       var env_user = getenv("USER");
       var env_home = getenv("HOME");
     } else {
       // Windows 用の設定
       var env_user = getenv("USERNAME");
       var env_home = getenv("HOMEPATH");
     }
      var env_mozdebug= getenv("MOZILLA_DEBUG");
    

     

    デバッグ - Bugzilla

    ランタイムメッセージ

    Unix のシェル (export MOZILLA_DEBUG=1) または Windows の command.com 環境変数 (set MOZILLA_DEBUG=1) で MOZILLA_DEBUG を定義した場合は、デバッグメッセージの出力を有効にする var env_mozdebug=getenv("MOZILLA_DEBUG") の存在に注目してください。

    不要な空白に関するバグ

    著者は、おそらく Mozilla 1.8 で修正されるであろう問題を発見しました。バグ報告と回避策は バグ 229271 をご覧ください。簡単に言えば、autoconfig/preffcalls.jsgetLDAPValue() 関数に以下の行を追加してください。

            start_pos += search_key.length;
    //start 
            start_pos +=1;
    //end
    

    資料

    文書が用意されていない問題についても バグ 178685 に報告しました。最終的には、http://wangrepublic.org/daniel/mozilla/prefs/ にあるような素晴らしい資料が完成する予定です。

    ホームページのための defeultPref

    defaultPref 関数でホームページを設定することができません。このため、標準設定が利用され、ユーザが変更できてしまいます。この問題に関するバグも開かれています。バグ 272970 をご覧ください。

    greprefs の適切な権限

    Linux では、MOZILLA_HOME/greprefs ディレクトリに対して標準ではユーザのアクセス権がなく、AutoConfig が正しく機能しないことにも注意してください。この問題に関するバグは バグ 270623 です。回避策は chmod 755 greprefs とすることです。

    メールフォルダ

    著者は、このソリューションを実装する際、メールフォルダについて面倒なことに遭遇しました。当初は、ログインしているユーザのホームディレクトリにあるローカルのメールフォルダを使用しようと考えていました。このフォルダは、Unix では $HOME/nsmail/... になり、Windows では同じ Unix パスの Samba マウントになります (例えば U:\nsmail というパスで、U: は Samba マウント \\samba-server\%USERNAME ということです)。しかし、ファイルシステムの書き込みやメールの形式が Windows と Unix で異なり、システム間で読み出しや書き込みを行うと、フォルダがすぐに読み出し不可能になったり、場合によっては破損してしまうといった問題が起こりました。

    このようなことから、最終的には IMAP を採用し、IMAP フォルダを使用することにしました。また、ワシントン大学の IMAP サーバから Cyrus サーバに移行することで、容量制限や共有フォルダ、アクセス制御リスト (ACL)、メールのみのアカウント (/etc/passwd のエントリーが不要)、優れたパフォーマンスなど、いくつかの興味深い機能を引き継ぐことができました。

    信頼性

    フェイルオーバーと唯一性

    Roberto Aguilar 氏による貢献のおかげで、Mozilla の AutoConfig JavaScript に、ある LDAP サーバがダウンしていた場合に別のミラーサーバを検索する方法が実装されました。

    また、if... else 形式による巧妙な環境変数テストを行うことで、両方のシステム (Linux と Windows) で同じ JavaScript を用いることが可能になりました。

    LDAP サーバのフェイルオーバー

    利用可能な LDAP サーバの配列を作成しておくことで、サーバのフェイルオーバーを実現できます。シャッフル関数によって、動作している LDAP サーバをひとつランダムに選択することができます。

    シャッフル関数は http://www.mickweb.com/javascript/ar...reshuffle.html にあるものを利用しました。

    変更したコードを公開する際は、シャッフル変数の直前に以下の注釈を追加してください。

     /**
      * 配列のシャッフル方法の定義
      * Mickweb Script Factory のコードを利用しました。
      * http://www.mickweb.com/javascript/arrays/pureshuffle.html
      */
    

    LDAP サーバのフェイルオーバーの実装は以下の通りです。

    // 2) フェイルオーバー用に複数の LDAP サーバを定義
      var ldap_values;
      var ldap_servers = new Array('ldap2.int-evry.fr',
                          'ldap1.int-evry.fr',
                          'openldap.int-evry.fr'
                          );
      // サーバ配列からランダムに選択を行うシャッフル関数
      // 配列のシャッフル方法の定義
      Array.prototype.shuffle = function(times) {
        var i,j,t,l=this.length;
        while(times--) {
          with(Math) {
        i = floor(random()*l);
        j = floor(random()*l);
          }
          t       = this[i];
          this[i] = this[j];
          this[j] = t;
        }
        return this;
      }
     // LDAP サーバをシャッフルし、毎回同じサーバが選択されないようにする
      ldap_servers.shuffle(10);
    ....
    // 4) LDAP サーバを呼び出し、LDAP 属性 (mail と cn) を取得します。これは最終的に上記 3 の processLDAPValues() を呼び出します
    // LDAP ミラーサーバ一覧を参照
    for(i = 0; i < ldap_servers.length; i ++) {
    // uid に $USER または $USERNAME をセットし、LDAP サーバから mail と cn 属性を検索
      getLDAPAttributes(ldap_servers[i],
           "ou=people,dc=int-evry,dc=fr",
           "uid=" + env_user,
           "uid,cn,mail");
        // 稼働している LDAP サーバに当たったらループを抜ける
        if(ldap_values) {
          running_ldap_server = ldap_servers[i];
            // $MOZILLA_DEBUG=1 が定義されている場合は、稼働しているサーバをポップアップで表示
          if (env_mozdebug) {
            displayError("getLDAPAttributes: デバッグ 2 running_ldap_server: " + running_ldap_server);
           }
          break;
        }
      }
    

     

    スクリプトの例

    以下は、ここまでで説明されている内容を反映したスクリプトの実例です。

    // Mozilla AutoConfig, Jehan Procaccia & Roberto Aguilar
     
    // すべての行を try/catch 文に含めます
    try {
    /*
    1) 環境変数を定義
    2) LDAP ミラーサーバをリストしてランダム化
    3) processLDAPValues() を定義
    4) getLDAPAttributes() で LDAP サーバを呼び出して LDAP 属性 (mail と cn) を取得
    5) ユーザ設定を定義
    */
     
    // 1) 環境変数
    if(getenv("USER") != "") {
       // *NIX 用の設定
       var env_user = getenv("USER");
       var env_home = getenv("HOME");
     } else {
       // Windows 用の設定
       var env_user = getenv("USERNAME");
       var env_home = getenv("HOMEPATH");
     }
      var env_mozdebug= getenv("MOZILLA_DEBUG");
     
    // 2) フェイルオーバー用に複数の LDAP サーバを定義
      var ldap_values;
      var ldap_servers = new Array('ldap2.int-evry.fr',
                          'ldap1.int-evry.fr',
                          'openldap.int-evry.fr'
                          );
      // サーバ配列からランダムに選択を行うシャッフル関数
    /**
      * 配列のシャッフル方法の定義
      * Mickweb Script Factory のコードを利用しました。
      * http://www.mickweb.com/javascript/arrays/pureshuffle.html
      */ 
      // 配列のシャッフル方法の定義
      Array.prototype.shuffle = function(times) {
        var i,j,t,l=this.length;
        while(times--) {
          with(Math) {
        i = floor(random()*l);
        j = floor(random()*l);
          }
          t       = this[i];
          this[i] = this[j];
          this[j] = t;
        }
        return this;
      }
     // LDAP サーバをシャッフルし、毎回同じサーバが選択されないようにする
      ldap_servers.shuffle(10);
     
    /* 3) ここで定義しておく (下の 4 以降では機能しないため) processLDAPValues() は、後で直下の getLDAPAttributes() によって呼び出されます。$MOZILLA_HOME/defaults/autoconfig/prefcalls.js で定義されている getLDAPAttributes() コードを参照すれば、「ユーザ定義」された processLDAPValues() への内部呼び出しを確認できます。
    */
    function processLDAPValues(values) {
     if(values) {
          // LDAP クエリから返ってきた値でグローバル変数をセットします
          ldap_values = values;
        var uid = getLDAPValue(values, "uid");
        var cn = getLDAPValue(values, "cn");
        var mail = getLDAPValue(values, "mail");
         // LDAP 変数 (mail と cn) に依存した設定項目を、設定可能なうちにロック
        lockPref("mail.server.server1.name", mail);
        lockPref("mail.identity.id1.fullName", cn);
        lockPref("mail.identity.id1.useremail", mail);
        defaultPref("network.ftp.anonymous_password", mail);
     
        // $MOZILLA_DEBUG=1 が定義されている場合は、デバッグメッセージをポップアップで表示
        if (env_mozdebug) {
            displayError("エラーはありませんでした。MCI (jehan.procaccia@int-evry.fr)" + "\nこのメッセージはdisplayError() で表示しています。\nデバッグ 1 mozilla.cfg v3.2、成功、S2IA 再び", "\nmail:" + mail + "\nuid:" +uid + "\ncn:" +cn + "\nuser:" + env_user);
            }
        }
      }
     
    // 4) LDAP サーバを呼び出し、LDAP 属性 (mail と cn) を取得します。これは最終的に上記 3 の processLDAPValues() を呼び出します
    // LDAP ミラーサーバ一覧を参照
    for(i = 0; i < ldap_servers.length; i ++) {
    // uid に $USER または $USERNAME をセットし、LDAP サーバから mail と cn 属性を検索
      getLDAPAttributes(ldap_servers[i],
           "ou=people,dc=int-evry,dc=fr",
           "uid=" + env_user,
           "uid,cn,mail");
        // 稼働している LDAP サーバに当たったらループを抜ける
        if(ldap_values) {
          running_ldap_server = ldap_servers[i];
            // $MOZILLA_DEBUG=1 が定義されている場合は、稼働しているサーバをポップアップで表示
          if (env_mozdebug) {
            displayError("getLDAPAttributes: デバッグ 2 running_ldap_server: " + running_ldap_server);
           }
          break;
        }
      }
     
    // 5) ユーザ設定を定義
     
    // ブラウザ
    lockPref("browser.startup.homepage", "http://www.int-evry.fr/s2ia/portail/");
    //unlockPref("browser.startup.homepage");
    lockPref("browser.startup.homepage_override", true);
    lockPref("startup.homepage_override_url", "http://www.int-evry.fr/s2ia/portail/");
    //unlockPref("startup.homepage_override_url");
    lockPref("browser.cache.disk.capacity", 100);
    lockPref("network.cookie.cookieBehavior", 0);
     
    // ネットワーク設定
    lockPref("network.proxy.autoconfig_url", "http://www.int-evry.fr/local/config.proxy");
    lockPref("network.proxy.type", 2);
     
    // プライバシーとセキュリティ
    defaultPref("signon.rememberSignons", false);
     
    // アカウント
    lockPref("mail.account.account1.identities", "id1");
    lockPref("mail.account.account1.server", "server1");
    lockPref("mail.account.account2.server", "server2");
    lockPref("mail.account.account3.server", "server3");
    lockPref("mail.accountmanager.accounts", "account1,account2,account3");
    lockPref("mail.accountmanager.defaultaccount", "account1");
     
    // IMAP
    lockPref("mail.server.server1.hostname", "imap-int.int-evry.fr");
    lockPref("mail.server.server1.type", "imap");
    lockPref("mail.server.server1.login_at_startup", true);
    lockPref("mail.identity.id1.draft_folder", "imap://" + env_user + "@imap-int.int-evry.fr/Drafts");
    lockPref("mail.identity.id1.drafts_folder_picker_mode", "0");
    lockPref("mail.identity.id1.fcc_folder", "imap://" + env_user + "@imap-int.int-evry.fr/Sent");
    lockPref("mail.identity.id1.fcc_folder_picker_mode", "0");
    lockPref("mail.identity.id1.stationery_folder", "imap://" + env_user + "@imap-int.int-evry.fr/Templates");
    lockPref("mail.identity.id1.tmpl_folder_picker_mode", "0");
    lockPref("mail.identity.id1.valid", true);
    lockPref("mail.identity.id1.overrideGlobal_Pref", true);
    lockPref("mail.server.server1.download_on_biff", true);
    lockPref("mail.server.server1.login_at_startup", true);
    lockPref("mail.server.server1.userName", env_user);
    lockPref("mail.server.server1.delete_model", 0);
     
    // SMTP
    defaultPref("mail.identity.id1.smtpServer", "smtp1");
    defaultPref("mail.smtpserver.smtp1.auth_method", 0);
    defaultPref("mail.smtpservers", "smtp1");
    defaultPref("mail.smtpservers", "smtp1");
    defaultPref("mail.smtp.defaultserver", "smtp1");
    defaultPref("mail.smtpserver.smtp1.hostname", "smtp-int.int-evry.fr");
    lockPref("mail.identity.id1.organization", "INT Evry France");
    lockPref("mail.startup.enabledMailCheckOnce", true);
    lockPref("mail.ui.folderpane.version", 3);
    lockPref("mailnews.ui.threadpane.version", 2);
     
    // LDAP 設定
    lockPref("mail.identity.id1.directoryServer", "ldap_2.servers.ldapint");
    lockPref("ldap_2.prefs_migrated", true);
    lockPref("ldap_2.servers.history.filename", "history.mab");
    lockPref("ldap_2.servers.history.replication.lastChangeNumber", 0);
    lockPref("ldap_2.servers.ldapint.auth.savePassword", true);
    lockPref("ldap_2.servers.ldapint.description", "ldap-int");
    lockPref("ldap_2.servers.ldapint.filename", "abook-1.mab");
    lockPref("ldap_2.servers.ldapint.position", 3);
    lockPref("ldap_2.servers.ldapint.uri", "ldap://ldap1.int-evry.fr:389/ou=people,dc=int-evry,dc=fr??sub");
    lockPref("ldap_2.servers.pab.filename", "abook.mab");
    lockPref("ldap_2.servers.pab.replication.lastChangeNumber", 0);
     
    // News 設定
    lockPref("mail.server.server3.hostname", "news.int-evry.fr");
    lockPref("mail.server.server3.max_cached_connections", 2);
    lockPref("mail.server.server3.name", "news.int-evry.fr");
    lockPref("mail.server.server3.type", "nntp");
    lockPref("mail.server.server3.userName", env_user);
     
    // try 文を閉じて catch 文を呼び出します
    } catch(e) {
      displayError("lockedPref", e);
    }
    

    参考: 古い確実なスクリプト

    以下の内容は、少なくとも Netscape 4.x では動作確認済みです。

    下にある元のファイル (Netscape 4.x の章を参照) では、JavaScript 形式の設定ファイルを取得する Web サーバと、mailcn 属性を取得する LDAP サーバをそれぞれハードコーディングしていました。しかし、サーバがダウンした場合に備えて、ミラーサーバからも取得できるようにしておいた方がより安全です。Web サーバ名については、LDAP クエリを使って、利用可能なサーバの一覧を取得するようにしました。これにより、netscape.cfg ファイルに変更を加えるたびにエンコードし直す必要がなくなりました。コンピュータを OS ごと複製する際、一度だけ netscape.cfg ファイルを設定しておけば、LDAP や Web サーバの JavaScript 設定ファイル (集中管理設定) にはいつでも変更を加えることができます。

    netscape.cfg の拡張

    参照を行う、利用可能な Web サーバの一覧は、netscape.cfg で定義します。また、JavaScript 設定ファイルの名前もここで定義します。こうすることで、必要に応じて変更を加えたコンピュータを複製した場合も、netscape.cfg を編集せずに済みます。

    LDAP Web サーバ一覧のサブツリー
    $ ldapsearch -x * -b "ou=browser,ou=information,dc=int-evry, dc=fr" cn -LLL
    dn: ou=browser,ou=information,dc=int-evry,dc=fr
    
    dn: sn=http_server,ou=browser,ou=information,dc=int-evry, dc=fr
    cn: web1.int-evry.fr
    cn: web2.int-evry.fr
    
    dn: sn=http_unix_file, ou=browser,ou=information,dc=int-evry, dc=fr
    cn: /browser/config_file_unix.jsc
    
    dn: sn=http_win_file, ou=browser,ou=information,dc=int-evry, dc=fr
    cn: /browser/config_file_win.jsc
    
    netscape.cfg

    ここでは、LDAP クエリを単純にテストすることで、利用可能な LDAP サーバを選択しています。設定を行う LDAP クエリに対して応答があるか確認するだけです。(再度断っておきますが、著者は JavaScript に詳しくありません。もっと良い方法で LDAP サーバが稼働しているかどうかを確認できるかもしれません。Web サーバの確認については、このコードを自由に利用して構いませんので、著者に教えてください)

    if (getLDAPAttributes("ldap1.int-evry.fr", \
     "ou=browser,ou=information,dc=int-evry,dc=fr", \
     "sn=http_server", "cn") )
     var running_ldap_server = "ldap1.int-evry.fr";
     else if (getLDAPAttributes("ldap2.int-evry.fr", \
     "ou=browser,ou=information,dc=int-evry,dc=fr", \
     "sn=http_server", "cn") )
      var running_ldap_server = "ldap2.int-evry.fr";
      else if (getLDAPAttributes("ldap0.int-evry.fr", \
      "ou=browser,ou=information,dc=int-evry,dc=fr", \
      "sn=http_server", "cn") )
       var running_ldap_server = "ldap0.int-evry.fr";
      else alert("No LDAP server available!");
    

    Unix 用の netscape.cfg ファイルの完全な例です。

    with (PrefConfig) { // 必ず PrefConfig モジュール内部に記述します
    
    // 後で使用するいくつかの変数を作成します
    var env_user = getenv("USER");       // Windows ユーザ名
    var env_home = getenv("HOME");       // ユーザのホームディレクトリ
    var env_mozilla_home = getenv("MOZILLA_HOME");
    var env_mozdebug = getenv("MOZILLA_DEBUG");
    
    // LDAP サーバが稼働しているかを確認 (より良い方法が必要)
    
    if (getLDAPAttributes("ldap1.int-evry.fr", \
     "ou=browser,ou=information,dc=int-evry,dc=fr", \
     "sn=http_server", "cn") )
     var running_ldap_server = "ldap1.int-evry.fr";
     else if (getLDAPAttributes("ldap2.int-evry.fr", \
      "ou=browser,ou=information,dc=int-evry,dc=fr", \
      "sn=http_server", "cn") )
      var running_ldap_server = "ldap2.int-evry.fr";
      else if (getLDAPAttributes("ldap0.int-evry.fr", \
      "ou=browser,ou=information,dc=int-evry,dc=fr", \
      "sn=http_server", "cn") )
       var running_ldap_server = "ldap0.int-evry.fr";
      else alert("No LDAP server available!");
    
    if (running_ldap_server){ 
    var ldap_http_server_values = getLDAPAttributes(running_ldap_server, \
    "ou=browser,ou=information,dc=int-evry,dc=fr", "sn=http_server", "cn");
    var ldap_http_server = getLDAPValue(ldap_http_server_values, "cn");
    var ldap_http_unix_uri_values = getLDAPAttributes(running_ldap_server, \
    "ou=browser,ou=information,dc=int-evry,dc=fr", "sn=http_unix_file", "cn");
    var ldap_http_unix_uri = getLDAPValue(ldap_http_unix_uri_values, "cn");
    var values = getLDAPAttributes(running_ldap_server, \
    "ou=people,dc=int-evry,dc=fr", "uid="+env_user, "cn,mail");
    var ldap_email = getLDAPValue(values, "mail");
    var ldap_gecos = getLDAPValue(values, "cn");
    env_user=env_user.toLowerCase();
    }
    else
     alert("No LDAP server available, AutoConfig impossible!");
    
    // $MOZILLA_DEBUG=1 が定義されている場合は、デバッグメッセージをポップアップで表示
    if (env_mozdebug) {
     alert("MOZILLA_DEBUG\nrunning LDAP server: " + running_ldap_server);
     alert("MOZILLA_DEBUG\nExecuting " + ldap_http_server + \
     ldap_http_unix_uri);
     alert("MOZILLA_DEBUG\nfetching http://" + ldap_http_server \
     + ldap_http_unix_uri + "");
    }
    
    // HTTP サーバから設定ファイルを取得
    // HTTP サーバが稼働しているか確認する方法が必要
    
    config(
    "autoadmin.global_config_url", "http://" + ldap_http_server + \
    ldap_http_unix_uri + ""
    );
    
    // ファイルを使用しているため、アクセスできない場合は、何か問題があります
    config(
    "autoadmin.failover_to_cached", false
    );
    
    // CGI による URL リクエストに ?useremail=email-addr を付加しない
    config(
    "autoadmin.append_emailaddr", false
    );
    
    } // with (PrefConfig)
    

    Windows 版の netscape.cfg ファイルでは、LDAP クエリの "sn=http_unix_file""sn=http_win_file" に置き換えます。

     

    LockPref 設定ファイル

    このファイル (サーバ上では http://www/browser/config-file-system.jsc にあるとします) では、設定項目の設定やロックを行います。著者の環境では共有のコンピュータを使用しているため、ユーザごとに設定をカスタマイズする必要があります。ログイン名は環境変数から取得します。Unix では USER、Windows では USERNAME になります。このように、Windows と Unix では環境変数とパスが異なるため、別々の設定ファイルを用意しています。同じファイルで両方のシステムを管理する方法があるはずですが、残念ながら著者は JavaScript に詳しくないのです。

    以下は Unix 用の設定ファイル (config_file_unix.jsc) での lockPref の記述例です。IMAP サーバ名、法人名、キャッシュの場所やサイズなど、いくつかの設定をロックし (lockPref)、ホームページなど他の設定は単に初期設定としています (defaultPref)。また、prefcalls.js で定義されている LDAP 関数を使用してログインユーザ (USER または USERNAME) のメールアドレスとコモンネーム、つまり LDAP 上の各自の mailcn を取得しています。

    [root@lugdunum /var/www/html/browser]
    $ more config_file_unix.jsc
    // 利用できる関数:
    // lockPref(name, value) はユーザによる変更を許可しない
    //  (別名 lock_pref())
    // defaultPref(name, value) ユーザが変更しない限り、この値を使用
    //  (別名 default_pref())
    // unlockPref(name) 前にロックした設定を解除
    // config(name, value) 通常はメニューに使用
    // value = getPref(name) 現在の設定を取得
    // getLDAPAttributes(host, base, filter, attributes)
    // getLDAPValue(values, attribute)
    // .mime.type, .begin_mime_def, .end_mime_def..
    // .plat
    // alert(message);
    // var = prompt(message);
    // var = getPlatform() 戻り値は Win32 など
    //  getPlatform().contains("UNIX")...
    // var = getenv(envvar)
    // var = putenv(envvar)
    //
    // 利用できないオブジェクトや関数は、navigator.* で定義されていないため
    // (これは本当に良くないと思います)
    //=========================================================================
    // 設定を定義
    //=========================================================================
    with (PrefConfig) {
    var values = getLDAPAttributes("ldap2.int-evry.fr", \
    "ou=people,dc=int-evry,dc=fr", "uid=" + env_user, "cn,mail");
    var ldap_email = getLDAPValue(values, "mail");
    var ldap_gecos = getLDAPValue(values, "cn");
    //var toto = prompt("email");
    //alert("ldap_mail = " + ldap_email + "toto=" + toto);
    if (env_mozdebug) {
     alert("env_user:" + env_user + "\nenv_home:" + env_home + \
    "\nldap_email:" + ldap_email + "\nldap_gecos:" + ldap_gecos + "\n");
    }
    //-----------------------------------------------------------------------
    // [ 一般的なブラウザ設定 ]
    //-----------------------------------------------------------------------
    config("autoadmin.refresh_interval", 1440); // 24 時間ごとに自動更新
    defaultPref("browser.startup.page",1); 
    //0=blank page, 1=homepage, 2=last visited
    defaultPref("browser.startup.homepage", "http://www/mci/mode-d-emploi.shtml");
    lockPref("browser.cache.directory", "/tmp");
    lockPref("browser.cache.memory_cache_size", 0);
    
    lockPref("mail.server_type",1); // POP=0 IMAP=1
    lockPref("network.hosts.imap_servers", "pop-int");
    lockPref("mail.imap.server.pop-int.using_subscription",true);
    lockPref("mail.imap.server.pop-int.userName", env_user);
    lockPref("mail.identity.useremail", ldap_email);
    lockPref("mail.identity.username", ldap_gecos);
    lockPref("mail.check_new_mail", false);
    lockPref("mail.directory", env_home+"/nsmail");
    lockPref("mail.identity.defaultdomain", "int-evry.fr");
    lockPref("mail.identity.organization", "INT Evry Essonne ");
    
    // LDAP
    lockPref("ldap_2.autoComplete.useDirectory", true);
    lockPref("ldap_2.servers.LDAPINT.autoComplete.enabled", true);
    lockPref("ldap_2.servers.LDAPINT.csid", "UTF-8");
    lockPref("ldap_2.servers.LDAPINT.description", "LDAP INT");
    lockPref("ldap_2.servers.LDAPINT.filename", "LDAPINT.na2");
    lockPref("ldap_2.servers.LDAPINT.position", 2);
    lockPref("ldap_2.servers.LDAPINT.searchBase", "ou=people,dc=int-evry,dc=fr");
    lockPref("ldap_2.servers.LDAPINT.serverName", "ldap1.int-evry.fr");
    
    // News
    lockPref("news.directory", "/tmp");
    // プロキシ
    lockPref("network.proxy.autoconfig_url", \
    "http://www.int-evry.fr/local/config.proxy");
    
    } // with (PrefConfig)
    

     

     

     


    この文書の最初のバージョンは HEVEA を用いて LaTeX から翻訳されました。

    "author" : " Jehan Procaccia MCI INT-EVRY- jehan.procaccia AT int-evry.fr"

    "creation date" : " 02 September 2006"

    ドキュメントのタグと貢献者

    Contributors to this page: Kohei, Piro, kohei.yoshino, teoli, Marsf
    最終更新者: teoli,