この文書では、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ファイル)を使えば、環境変数 (USER
、HOME
など) や 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 行目はコメントアウトにする必要があります。
ファイルのエンコードには、https://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 では自動インストールのカスタマイズなども可能です)。詳しくは https://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", "https://server/auto-config-file.jsc");
のように追記するか、MOZILLA_HOME
ディレクトリに置いた AutoConfig ファイルの中でlockPref("autoadmin.global_config_url", "https://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=1
と MOZ_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", "[email protected]"); 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=procacci
、USER=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", "https://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()
によってこのようなポップアップウィンドウが表示されます。
これは「警告」というタイトルのウィンドウですが、ただのデバッグツールであって、他にポップアップで情報を表示する方法は確認できていません。詳しくは バグ 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 <[email protected]> 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 ファイルを利用している環境で、おのおのの方法によって設定された設定値は、ユーザプロファイル内に設定が全く保存されていない新規プロファイルで起動した場合は以下の優先順位で反映されます。
MOZILLA_HOME/defaults/pref/*.js
での初期設定値:最も優先順位が低い- 各アドオンの
defaults/preferences/*.js
での初期設定値 - ローカルの AutoConfig ファイル(
MOZILLA_HOME/*.cfg
)において、defaultPref()
ディレクティブで設定された値 - リモートの AutoConfig ファイルにおいて、
defaultPref()
ディレクティブで設定された値 - ユーザプロファイル内のprefs.jsに保存された設定値
- user.jsで設定された値
- ローカルの AutoConfig ファイルにおいて、
pref()
ディレクティブで設定された値 - リモートの AutoConfig ファイルにおいて、
pref()
ディレクティブで設定された値 - ローカルの AutoConfig ファイルにおいて、
lockPref()
ディレクティブで設定された値 - リモートの AutoConfig ファイルにおいて、
lockPref()
ディレクティブで設定された値:最も優先順位が高い
AutoConfig による設定が意図通りに働かないケース
設定が読み込まれる順番次第で、ユーザの設定が失われる場合があります。
例えばローカルの AutoConfig に defaultPref("dom.disable_open_during_load", false);
という記述がある場合、これは、通常はtrueが初期値となっている dom.disable_open_during_load
の初期値をfalseに設定し、ユーザが任意にtrueに変更できるようにする、という風な結果を想定したものと考えられます。
しかし実際には、ユーザが設定値をtrueに変更した場合、次回の Firefox 起動時には以下のような現象が起こります。
- firefox.js によって
dom.disable_open_during_load
の初期値がtrueと定義される - ユーザが変更した結果 prefs.js に保存されていた値 true が読み込まれる。これは初期値に等しいため、消去される。
- 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 に関する関連資料
https://mit.edu/~firefox/www/maintain...utoconfig.html
https://www.alain.knaff.lu/howto/Mozi...ion/index.html
https://thegoldenear.org/toolbox/wind...re-config.html
https://ilias.ca/blog/2005/03/locking...efox-settings/
Windows でのコンパイル方法:
https://forums.mozillazine.org/viewtopic.php?t=276014
https://www.mozilla.org/community/dev...er-forums.html
https://forums.mozillazine.org/viewto...config#2090731
https://forums.mozillazine.org/viewto...config#1354355
https://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", "https://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", "https://www.int-evry.fr/mci/user/"); lockPref("browser.cache.disk.capacity", 0); lockPref("network.cookie.cookieBehavior", 0); lockPref("network.proxy.autoconfig_url", "https://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 環境では、USER
や HOME
といった環境変数は、USERNAME
や HOMEPATH
になります。AutoConfig ファイル内で環境変数を参照する場合は注意してください。
if... else
形式のテストで、例えば USER
と USERNAME
のように、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.js
の getLDAPValue()
関数に以下の行を追加してください。
start_pos += search_key.length; //start start_pos +=1; //end
資料
文書が用意されていない問題についても バグ 178685 に報告しました。最終的には、https://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 サーバをひとつランダムに選択することができます。
シャッフル関数は https://www.mickweb.com/javascript/ar...reshuffle.html にあるものを利用しました。
変更したコードを公開する際は、シャッフル変数の直前に以下の注釈を追加してください。
/** * 配列のシャッフル方法の定義 * Mickweb Script Factory のコードを利用しました。 * https://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 のコードを利用しました。 * https://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 ([email protected])" + "\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", "https://www.int-evry.fr/s2ia/portail/"); //unlockPref("browser.startup.homepage"); lockPref("browser.startup.homepage_override", true); lockPref("startup.homepage_override_url", "https://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", "https://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 サーバと、mail
や cn
属性を取得する 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 https://" + ldap_http_server \ + ldap_http_unix_uri + ""); } // HTTP サーバから設定ファイルを取得 // HTTP サーバが稼働しているか確認する方法が必要 config( "autoadmin.global_config_url", "https://" + 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 設定ファイル
このファイル (サーバ上では https://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 上の各自の mail
と cn
を取得しています。
[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", "https://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", \ "https://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"