JP5640138B2 - インプットメソッドエディタ - Google Patents

インプットメソッドエディタ Download PDF

Info

Publication number
JP5640138B2
JP5640138B2 JP2013235738A JP2013235738A JP5640138B2 JP 5640138 B2 JP5640138 B2 JP 5640138B2 JP 2013235738 A JP2013235738 A JP 2013235738A JP 2013235738 A JP2013235738 A JP 2013235738A JP 5640138 B2 JP5640138 B2 JP 5640138B2
Authority
JP
Japan
Prior art keywords
ime
server
client
version
session
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2013235738A
Other languages
English (en)
Other versions
JP2014078243A (ja
Inventor
大悟 波村
大悟 波村
弘幸 小松
弘幸 小松
淳 向井
淳 向井
拓 工藤
拓 工藤
卓也 及川
卓也 及川
俊行 花岡
俊行 花岡
靖広 松田
靖広 松田
洋平 湯川
洋平 湯川
悠介 田畑
悠介 田畑
Original Assignee
グーグル・インコーポレーテッド
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by グーグル・インコーポレーテッド filed Critical グーグル・インコーポレーテッド
Priority to JP2013235738A priority Critical patent/JP5640138B2/ja
Publication of JP2014078243A publication Critical patent/JP2014078243A/ja
Application granted granted Critical
Publication of JP5640138B2 publication Critical patent/JP5640138B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Description

本発明は、インプットメソッドエディタ(Input Method Editor(IME))に関する。
IMEは、テキストエディタ、ワープロソフト、アプリケーション(例えば、ウェブブラウザ等のテキストが入力されるアプリケーション)とともに使用され、所定の言語の文字入力を支援するコンピュータプログラムである。日本語、中国語など様々な言語用のIMEがある。また、よく知られているIMEとして、Microsoft社の「MS-IME」、Apple社の「ことえり」、ジャストシステム社の「ATOK」、Unix(登録商標)用のWnn、Canna、等がある。
[1.セキュリティ上の課題]
IMEは、イベント処理部、GUI(グラフィカルユーザインタフェース)表示部、テキスト変換部を含む複数の機能からなる。これらの機能は、典型的に、一体構造のコンポーネント(特定の機能を持つソフトウェア部品)として実現される。Microsoft社のWindows(登録商標)では、このコンポーネントは1つのプロセスとして実行される形式ではなく、アプリケーションによってロードされる1つのDLL(ダイナミックリンクライブラリ)である。従って、このコンポーネントはアプリケーションと同じ権限で実行される。IMEコンポーネントがセキュリティホールを有すると、攻撃者は不正にホストアプリケーションの権限を獲得することができる。これは大きなセキュリティ上の懸念事項である。例えば、winlogon.exeのようなスクリーンロックプログラムがIMEの脆弱性を利用して攻撃者によって攻撃されると、攻撃者はスクリーンをロックしたユーザの権限を用いて任意のプログラムを実行することができる。
[2.移植性に関する課題]
MS-IME(Windows(登録商標)のデフォルトのIME)および「ことえり」(Macintosh(登録商標)のデフォルトのIME)は一体構造の設計に基づく。すなわち、全てのコンポーネントは1つのバイナリファイルとして実装されている。この実装は国際化(インターナショナライゼーション、I18N)および移植をより困難にする。MS-IMEおよび「ことえり」は、中国語、日本語、韓国語について異なるIME実装を有する。そのため、MS-IMEのコードはこれらの言語の間で共有されない。
Unix(登録商標)用のよく知られた日本語インプットメソッドであるWnnおよびCannaは、クライアント−サーバモデルを採用している。しかし、クライアントとサーバの間のプロトコルは状態を有し、日本語指向である。WnnおよびCannaのクライアントは、生のキー入力情報をサーバに送信しない。そのため、IMEクライアントの開発者は、クライアントとサーバの間で共有するセッション情報を注意深く管理しなければならない。これらのIMEのプロトコルは日本語固有の情報をエンコードするので、そのプロトコルを、中国語および韓国語を含む他の言語に移植することをより困難にしている。
言語に依存せず、移植性を有するインプットメソッドを実装するための主な課題は次の通りである。
1つの課題は、IMEフレームワークの相違を吸収することが難しいことである。IMEを実装するために“インプットメソッドフレームワーク”を使用しなければならない。しかし、異なるオペレーティングシステムは異なるインプットメソッドフレームワークを提供する。例えば、Windows(登録商標)はIMM32/TSF(テキストサービスフレームワーク)を提供し、Macintosh(登録商標)はIMKitを提供する。これらのフレームワークのAPI(アプリケーションプログラムインタフェース)は異なる。インプットメソッドフレームワークの相違は、あるプラットフォームから他のプラットフォームにIMEを移植することを困難にする。ジャストシステム社のみ、Windows(登録商標)/Macintosh(登録商標)/Linux(登録商標)上で動作するIMEであるATOKを販売している。オープンソースのIME開発者を含め、他のIME製造業者は、移植性のないIMEフレームワークの制限の理由から、1つのプラットフォームに集中している。
もう1つの課題は、異なる言語におけるIMEの使い勝手の差を吸収することが難しいことである。言語が異なると、IMEの使い勝手が異なる。ユーザは、完全な日本語テキストを入力するために3つの中間の状態(基本入力、事前編集、変換)を通る必要がある。一方、中国語のIMEは2つのみの状態を有する。また、日本語IMEでは、異なるキー割り当て(key bindings)(MS-IME形式、ことえり形式、等)をサポートする必要がある。例えば、Ctrlキーを押したままdキーを押すことは、ことえり形式では“delete”(一文字削除)に対応する。全ての可能性のあるキー割り当てに拡張すると、その大きさは500になる。中国語IMEではそのようなキー割り当てをサポートする必要はない。IMEの実装はラインエディタの実装と類似している。
上記1および2の課題を解決するためIMEをクライアント−サーバモデルで実現することを考えると、下記3および4のような課題が生じる。
[3.バージョンの更新に関する課題]
クライアント−サーバモデルで設計されたIMEは、IMEクライアントのみが新たなバージョンに更新され、古いバージョンのIMEサーバがまだ動作している場合、またはその逆の場合に問題を有する。IMEクライアントプログラムが更新されても、既存のアプリケーションがまだ古いバージョンのIMEクライアントを使用している(古いバージョンのIMEクライアントプログラムを実行中である)場合、2つの異なるIMEクライアントが1つのIMEサーバにアクセスする場合が生じうる。新たなバージョンのIMEクライアントが、古いバージョンのIMEサーバとの間の古いバージョンの通信プロトコルをサポートしないとき、IMEクライアントは動作しない。古いバージョンのIMEクライアントと新たなバージョンのIMEサーバの間でも同じことが生じる。
このようなバージョンの不一致を防止する典型的な方法は、コンピュータの再起動、または、ログアウトして全てのアプリケーションを再度開始することである。これは、特に、ユーザに気付かれずにIMEを更新することが期待されている場合、たいへん煩わしい。
[4.IMEサーバの異常終了に関する課題]
状態のないIMEクライアントが各々のキー入力イベントをIMEサーバに送信して出力情報を受信するクライアント−サーバ型のIMEにおいて、入力セッションの間に、IMEサーバが異常終了して再起動されたとき、ユーザは意図しない出力を見ることになりうる。
いくつかの既存のIMEはクライアント−サーバモデルで実装されている。しかし、これらの実装はサーバのクラッシュおよび再起動を考慮していない。
本発明は、第1に、プロセスを隔離した安全なIMEの実装に関する。
第2に、言語に依存せず、移植性を有するインプットメソッド実装のための状態のないセッション管理に関する。
第3に、コンピュータの再起動なしでのIMEバージョンの更新に関する。
第4に、セッションのプレイバックに関する。
[1.セキュリティ上の課題に対する解決手段]
本発明では、安全性の目的のために、IMEを複数のプロセス(一形態として、1つのクライアントDLLと1つのサーバプロセス)に分離して機能をモジュール化する。複数のプロセスには、異なるセキュリティポリシーを適用し、サンドボックス、整合性レベルの変更のような異なる保護技術を適用することが可能である。
ここで、「サンドボックス」とは、保護された領域内でプログラムを動作させ、その領域の外へ影響が及ぶのを防止する技術である。
また、「整合性レベル」とは、Microsoft社のWindows Vista(Windowsは登録商標)で導入されたセキュリティ上の概念である。この整合性レベルは、高・中・低と分かれており、それによって、下記のように、ファイルシステムにどこまでアクセスできるかが決まる。
高:%ProgramFiles%やHKLMへの書き込みが可能(管理者権限)。
中:%UserProfile%やHKCUへの書き込みが可能(ユーザ権限)。
低:専用の場所にのみ書き込みが可能。
本発明では、IMEコンポーネントを、イベント処理部、GUI表示部、テキスト変換部の3つに分けた。Windows(登録商標)において、イベント処理部とGUI表示部は1つのDLLコンポーネントであるが、複雑さを軽減するために機能を制限した。テキスト変換部はより低い整合性レベルで、サンドボックス内で実行される隔離されたプロセスである。なお、テキスト変換部は、GUI表示部に表示内容を指示するための表示情報を生成および送信する機能を含む。
例えば、Windows(登録商標)において、「高」整合性レベルを有するシステムツールが本発明によるIMEコンポーネントをロードするとき、IMEコンポーネントも「高」整合性レベルで実行されるが、これはイベント処理部とGUI表示部のみである。テキスト変換部は「低」整合性レベルで、サンドボックス内で実行される。さらに、イベント処理部およびGUI表示部は、テキスト変換部との接続をポリシーに従って停止することができる。
Apple社のMacintosh(登録商標)では、イベント処理部は1つのプロセスであるので、問題はWindows(登録商標)より簡単である。イベント処理部の権限は制御することができる。本発明では、イベント処理部とテキスト変換部を分離することによってテキスト変換部をサンドボックス内に配置して機能を制限することができる。
[2.移植性に関する課題に対する解決手段]
IMEの移植性および国際化を向上させるIMEアーキテクチャを開示する。IMEを実装するために、各々のオペレーティングシステムが提供するIMEフレームワークを使用しなければならない。これらのフレームワークの違いはIMEの移植を困難にする。また、言語が異なるとIMEの使い勝手が異なる。IMEアーキテクチャを言語から独立にすることは困難であることが知られている。本発明では、基本的に、IMEをクライアントとサーバの2つのコンポーネントに分離する。また、本発明では、クライアントとサーバの間で状態のないプロトコルを使用する。クライアントとサーバは、IPC(プロセス間通信)またはRPC(リモートプロシージャコール(遠隔手続き呼び出し))を用いて互いに通信する。言語に依存する全てのIMEモデルがサーバ内に実装され、これはIMEフレームワークに依存する必要がない。プロトコルは状態がないので、クライアントの役割を簡単にすることができ、クライアントはユーザのキー入力イベントを受信してサーバに送信し、サーバからの表示情報に従って表示する。単にサーバ部分を置き換えることによって新たな言語のための新たなIMEを実現することができる。
[3.バージョンの更新に関する課題に対する解決手段]
本発明は、コンピュータの再起動なしで実現されたIMEを更新する技術である。新たなバージョンのIMEクライアントが古いバージョンのIMEサーバと互換性のある通信プロトコルを有するとき、この更新はユーザに気付かれずに行われる。新たなバージョンのプロトコルが古いバージョンのプロトコルと互換性がないとき、それを検出し、どのように処理すべきかユーザに回答を促す。
[4.IMEサーバの異常終了に関する課題に対する解決手段]
IMEサーバインスタンスが異常終了したときでも、IMEクライアントは、以前のキー入力イベントを新たに実行されたサーバに再送することによって、現在のユーザセッションをシームレスに継続することができる。
本発明によるIMEは次のような効果を奏する。
<セキュリティ>
IME DLLはアプリケーションと同じセキュリティレベルで動作する。もし、IME DLLがセキュリティホールを有し、アプリケーションが高いセキュリティレベル(Windows Vista(Windowsは登録商標)において「高」整合性レベルとも呼ばれる)で動作しているならば、悪意のあるユーザ/アプリケーションは、セキュリティホールを利用して、ユーザの個人データ(ユーザ履歴データ)を取得し、それを外部のサーバに送信するような悪意のある操作を行うことも可能である。これに対し、本発明によるクライアント−サーバモデルは、悪意のあるユーザ/アプリケーションからユーザデータを保護することができる。本発明によるIMEサーバは隔離されているので、制限されたサンドボックス環境内でプロセスを起動することができる。サンドボックス化されたIMEサーバは、ローカルコンピュータにおいて安全でないリソースにアクセスすることができない。
<移植性>
異なるオペレーティングシステムは、異なるIMEフレームワークを有する。IMEをプラットフォームから独立にするために、これらのIMEフレームワークへの依存を最小にすることが望ましい。コアの変換エンジンを1つの独立したプロセスとして分離することは、移植性のために役立つ。
<ロバスト性>
アプリケーションがクラッシュすると、そのアプリケーションに結合しているIMEは同時にkillされる(プログラムの実行が終了させられる)。IMEがユーザ履歴または任意の変更可能なデータをローカルファイルシステムに同期させている間のアプリケーションのクラッシュは災難である。従来のIMEの設計は、このような場合に弱い。意図しないアプリケーションのクラッシュのために、時々、IME辞書が破壊されることがある。本発明では、そのような心配はない。本発明によるIMEクライアントDLLは状態のある動作をせず、IMEクライアントDLLがkillされても、セッション情報はIMEサーバ内に残っている。そのため、ユーザデータを安全にローカルファイルシステムに同期させることができる。
<プロセスに渡るロックを行わない>
1つのアプリケーションは、1つのIME DLLのインスタンスを生成する。従来は、複数のIMEインスタンスが存在し、辞書およびユーザ履歴のような共有リソースを使用していることが常に生じるので、IME DLLは共有リソースの同時使用を防止するために、プロセスに渡る相互排除ロックを使用しなければならない。これに対し、本発明によるIMEサーバはユーザごとに単一のプロセスであるので、システム自身はプロセスに渡るロックを行う必要がなく、これはIMEを従来のシステムよりずっと簡単にする。
本発明によるIMEアーキテクチャを表わす図である。 従来のIMEアーキテクチャを表わす図である。 本発明によるIMEアーキテクチャの概要を表わす図である。 名前付きパイプのパス名が表示されたウィンドウを表わす。 名前付きパイプのアクセス権が表示されたウィンドウを表わす。 バージョンの相違による動作を表わす図である。
以下、本発明の実施の形態について、詳細に説明する。
クライアント−サーバモデルで実装されたIMEの実行形式ファイルは、IMEクライアントプログラムとIMEサーバプログラムを含む。IMEクライアントは、IMEクライアントプログラムがコンピュータに読み込まれ、このプログラムに含まれる命令をコンピュータが実行することにより実現されると考えることができ、IMEサーバは、IMEサーバプログラムがコンピュータに読み込まれ、このプログラムに含まれる命令をコンピュータが実行することにより実現されると考えることができる。
また、説明中のアプリケーションは、アプリケーションプログラムがコンピュータに読み込まれ、このプログラムに含まれる命令をコンピュータが実行することにより構築される情報処理装置と考えることができる。
なお、説明中のDLL(ダイナミックリンクライブラリ)は、プログラムそのものを意味する場合と、DLLがコンピュータに読み込まれ、このプログラムに含まれる命令をコンピュータが実行することにより実現されるものを意味する場合がある。
本発明によるIMEは、複数のプラットフォームにおいて実現可能であるが、以下、主にWindows(登録商標)を例に説明する。
セキュリティ上の課題を解決する観点から、第1実施例を説明する。
<IMEアーキテクチャ>
図1に示すように、一実施形態によるIMEクライアントはWindows(登録商標)上の共有ライブラリ(DLL)として実現される。このDLLは、図2に示す、変換機能を含んでいた従来のDLLと比較してサイズが小さい。図1の点線内は、サンドボックス内で動作する、ユーザ毎に単一のIMEサーバである。移植性があり、大域的な相互排除はなく、ロバストである。一方、図2に示す従来のIMEアーキテクチャでは、アプリケーションの権限で動作し、変換機能は移植性がなく、共有リソースはプロセスに渡る相互排除ロックが必要であり、管理が難しかった。
アプリケーションがユーザによって起動されるとき、IME DLLはコンピュータのメモリに読み込まれ、アプリケーションと結合される。アプリケーションは“IMEフレームワーク”を通してIMEを呼び出す。Windows(登録商標)上のIMEフレームワークとしてIMM32およびTSFが利用可能である。IME開発者はIMEフレームワーク上で変換ロジックを実現しなければならない。図2に示すように、MS-IMEおよびATOKのようなよく知られたIMEは、DLL内にコアのIME変換ロジックを有する。これらの標準的なIMEと異なり、本発明によるIMEは、ローカルなクライアント−サーバモデルを採用する。コアの変換ロジックは、アプリケーションから隔離された1つの独立したプロセスとして実行される。アプリケーションに結合されたDLL(以下、IMEクライアントDLLと呼ぶ。)は、状態のない表示機能を実現する。すなわち、IMEクライアントDLLは、候補のウィンドウを表示し、テキストを強調表示し、ユーザからのマウス/キーボードイベントを取得する役割のみを果たす。IMEクライアントDLLはIPC(プロセス間通信)を介してほとんど全てのキーボード/マウスイベントをIMEサーバプロセスに送信し、表示情報を取得する。
本発明によるIMEは、移植性のあるクライアント−サーバモデルを採用する。ここで、クライアント−サーバは、OS上のローカルなサーバであって、クライアントの変換リクエストに対してサービスを提供する。遠隔のコンピュータ上のサーバプロセスではないが、オンラインでの変換も実現可能である。また、Windows(登録商標)、Macintosh(登録商標)、Linux(登録商標)をサポートする場合、クライアントはプラットフォームに固有のいくらかのコードが必要であるが、サーバはできる限りプラットフォームから独立にすることができる。
図3に示すように、サーバは、プラットフォームから独立であり、可能な限り全ての処理を行う。
クライアントは、プラットフォームに固有のフレームワーク(例えば、Windows(登録商標)用のIMM32またはTSF)を用いて実現される。クライアントは、状態のないイベントリスナおよびGUI表示部を有するシンクライアントである(Windows(登録商標)においては、イベントリスナとGUI表示部も分離されている)。
クライアントはサーバに全てのキー入力イベントを送信し、サーバはクライアントに表示情報を返送する(Windows(登録商標)においては、サーバから送信された表示情報に、座標などの描画情報を付与して、GUI表示部で表示している)。
<サンドボックスライブラリ>
本発明によるIMEサーバプロセスは、安全なサンドボックス内で起動される。これは、Google Chrome(Google社が開発したウェブブラウザ)のために使用されるサンドボックスライブラリを使用することができる。
IMEサーバプロセスのサンドボックス内での起動に関するプログラムコードの例を以下に示す。
wchar_t mozc_server_path[MAX_PATH];
if (S_OK != ::SHGetFolderPathW(NULL,
CSIDL_PROGRAM_FILES,
NULL,
SHGFP_TYPE_CURRENT,
mozc_server_path)) {
LOG(ERROR) << "cannot find Program and Files";
return false;
}
wcsncat_s(mozc_server_path, MAX_PATH,
L"\\Google\\Mozc\\mozc_server.exe",
_TRUNCATE);
HANDLE job_handle = 0;
// Create a Job inside restricted sandbox environment.
const DWORD err_code = sandbox::StartRestrictedProcessInJob(
mozc_server_path,
sandbox::USER_INTERACTIVE, // main token
sandbox::USER_INTERACTIVE, // impersonate token
sandbox::JOB_LOCKDOWN, // job token
sandbox::INTEGRITY_LEVEL_LOW, // integritiy level
&job_handle);
if (ERROR_SUCCESS != err_code) {
LOG(ERROR) << "cannot launch mozc_server: " << ::GetLastError();
return false;
}
sandbox::StartRestrictedProcessInJob()はサンドボックスでプロセスを開始させる便利な静的メソッドである。このメソッドは3つのパラメータ、main_token_level、impersonate_token_level、job_token_levelを受け取る。本発明の実装においては、Windows Vista(Windowsは登録商標)以後に導入された整合性レベルを設定できるように、元のコードを修正した。
<IMEサーバが通常のプロセスとして起動されることを防止する>
IMEサーバが通常のプロセスとして起動されることを防止するために、IMEサーバは、最初に、自身のプロセスが正しいサンドボックス環境内で実行されているかをチェックする。より詳しくは、次の健全性チェック(sanity check)が実行される。戻り値がServerUtil::DENYであるとき、IMEサーバプロセスは起動されない。
健全性チェックに関するプログラムコードの例を以下に示す。
HANDLE hToken = NULL;
// Open process token,
if (!::OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY, &hToken)) {
return ServerUtil::DENY;
}
// If CurrentProcess doesn't have RESTRICTED token, return ServerUtil::DENY
if (!::IsTokenRestricted(hToken)) {
::CloseHandle(hToken);
return ServerUtil::DENY;
}
TOKEN_STATISTICS ts;
DWORD dwSize = 0;
// Use token logon LUID instead of user SID, for brevity and safety
if (!::GetTokenInformation(hToken, TokenStatistics,
(LPVOID)&ts, sizeof(ts), &dwSize)) {
::CloseHandle(hToken);
return ServerUtil::DENY;
}
::CloseHandle(hToken);
// Do not execute the server if i'm system
const LUID SystemLuid = SYSTEM_LUID;
const LUID LocalServiceLuid = LOCALSERVICE_LUID;
const LUID NetworkServiceLuid = NETWORKSERVICE_LUID;
if (EqualLuid(SystemLuid, ts.AuthenticationId) ||
EqualLuid(LocalServiceLuid, ts.AuthenticationId) ||
EqualLuid(NetworkServiceLuid, ts.AuthenticationId)) {
return ServerUtil::DENY;
}
OSVERSIONINFO osi = { 0 };
osi.dwOSVersionInfoSize = sizeof(osi);
if (!::GetVersionEx(&osi)) {
return ServerUtil::DENY;
}
// Vista or later (Check the current session id is not 0)
if (osi.dwMajorVersion >= 6) {
// SessionId == 0 is special env.
DWORD dwSessionId = 0;
if (!::ProcessIdToSessionId(::GetCurrentProcessId(), &dwSessionId) ||
dwSessionId == 0) {
return ServerUtil::DENY;
}
}
// mozc_server's main thread is impersonated.
if (!::RevertToSelf()) {
return ServerUtil::DENY;
}
// OK my process is inside a safe environment!
return ServerUtil::NORMAL;
<クライアント−サーバのIPC>
Windows(登録商標)環境でクライアント/サーバを実現するために、COM(Component Object Model)を使用することが推奨されている。しかし、Windows Vista(Windowsは登録商標)の場合、アプリケーションが「高」整合性レベルで起動されると、本発明によるIME COMサーバも「高」整合性レベルで起動される。「低」整合性レベル、「中」整合性レベルの場合も同様である。従って、Windows Vista(Windowsは登録商標)の場合、異なる整合性レベルを有する3つのIMEサーバ(COMインスタンス)が同時に起動される。本発明によるクライアント−サーバモデルにおいて、ユーザ当たり1つのIMEサーバインスタンスは強い制約であり、複数のインスタンスを許容する次善策は望まない。
<IPCモデル>
一実施形態によるIMEは、単一スレッド、単一接続モデルを採用する。IMEサーバは1つのポートのみオープンし、IMEクライアントからの複数の接続を処理する。このモデルを採用する主な理由は、簡単さと良好な移植性である。ほとんど全てのプラットフォームが単一スレッド、単一接続のIPCをサポートしている。
<IPCの細分性(granularity)>
IMEクライアントは、全てのキー入力イベント(例えば、‘A’のキーを押した。)をサーバに送信し、そのキー入力イベントに対応する表示情報(例えば、‘A’は、下線を付して日本語“あ”として表示せよ。)を取得する。接続は状態がない。一般に、IPC接続の持続時間はたいへん短い。IMEサーバが表示情報の応答を完了すると、即座に接続を閉じて、他の接続を待つ。
<IPCタイムアウト>
単一接続/単一スレッドモデルの課題の1つは、悪意のあるユーザがIMEサーバに接続して何も行わないならば、IMEサーバはブロックされる(処理の進行を妨げられる)ことである。また、逆の場合も生じうる。悪意のあるIMEサーバがIMEクライアントに何も応答を送信しないならば、IMEクライアントはブロックされる。
このような場合を防止するために、IPC接続はタイムアウトを実行すべきである。サーバ/クライアントがある時間内(例えば、500ミリ秒以内)にメッセージを送信しないならば、サーバ/クライアントは現在の接続を終了する。Windows(登録商標)において、そのようなタイムアウトは、オーバーラップI/O(Overlapped I/O)を使用することによって容易に実現される。
タイムアウトに関するプログラムコードの例を以下に示す。
bool SendIPCMessage(HANDLE handle,
const char *buf, size_t buf_length, int timeout) {
if (buf_length == 0) {
return false;
}
OVERLAPPED Overlapped;
::ZeroMemory(&Overlapped, sizeof(Overlapped));
bool error = false;
while (buf_length > 0) {
if (!::WriteFile(handle, buf,
static_cast<DWORD>(buf_length), NULL, &Overlapped) &&
ERROR_IO_PENDING != ::GetLastError()) {
error = true;
break;
}
if (WAIT_OBJECT_0 != ::WaitForSingleObject(handle, timeout)) {
LOG(WARNING) << "Write timeout: " << timeout;
error = true;
break;
}
DWORD size = 0;
if (!::GetOverlappedResult(handle, &Overlapped, &size, TRUE)) {
error = true;
break;
}
buf_length -= size;
buf += size;
}
return !error;
}
<名前付きパイプのパス名>
実行されるプログラム同士がコンピュータ内部でデータをやり取りするプロセス間通信の方式の1つに名前付きパイプがある。
名前付きパイプのパス名は他のユーザから予測不可能であるべきである。そうでないと、悪意のあるユーザは、有効なIMEサーバが開始する前に、偽物の名前付きパイプのIMEサーバを生成することができる。さらに、悪意のあるユーザは、IMEサーバがパス名を生成するためにユーザ名を使用していると、それを発見することができるので、パス名の生成にユーザ名を使用することは安全ではない。
一実施形態によるIMEでは、128ビットのランダムなパス名を使用する。下記のGetSecureRandomSequence()はパス名を生成するために使用される。標準的なrand()関数は、その結果が予測可能でありうるので、安全ではない。
パス名の生成に関するプログラムコードの例を以下に示す。
bool Util::GetSecureRandomSequence(char *buf, size_t buf_size) {
memset(buf, '\0', buf_size);
HCRYPTPROV hprov;
if (!::CryptAcquireContext(&hprov,
NULL,
NULL,
PROV_RSA_FULL,
CRYPT_VERIFYCONTEXT)) {
return false;
}
if (!::CryptGenRandom(hprov,
static_cast(buf_size),
reinterpret_cast(buf))) {
::CryptReleaseContext(hprov, 0);
return false;
}
::CryptReleaseContext(hprov, 0);
}
図4は、Windows(登録商標)においてコンピュータが管理しているプロセスを一覧表示するprocess explorerのウィンドウを表わす。ウィンドウ内の下部の太線で囲まれた部分を見ると、名前付きパイプのパス名に乱数列が使用されていることが分かる。
<IMEクライアントDLLがパス名を知る方法>
IMEサーバが名前付きパイプのパス名を生成すると、そのパス名をユーザプロファイルディレクトリ内に保存する。ユーザプロファイルディレクトリの場所は、例えば、次の通りである。なお、<user>はユーザ名を表わし、<IME>はIMEに付与した固有の名称を表わす。
Windows XP(Windowsは登録商標)の場合
c:\Document Setting\<user>\Local Settings\Application Data\google\<IME>
Windows Vista(Windowsは登録商標)またはWindows 7(Windowsは登録商標)の場合
c:\Users\<user>\AppData\LocalLow\google\<IME>
Linux(登録商標)またはMacintosh(登録商標)の場合
~/.<IME>/
このユーザディレクトリ内のキーを共有することは、基本的に安全であるが、いくらかのセキュリティ上の懸念事項が存在する。Windows Vista(Windowsは登録商標)においてLocalLowフォルダは最も安全でない場所と考えられている。「中」/「高」整合性レベルで実行される任意のプロセスは、LocalLowフォルダ内のデータを信用すべきでない。
もう1つの懸念事項は、IMEサーバが起動される前に、悪意のあるアプリケーションがファイル内に偽物のパス名を保存できることである。IMEクライアントDLLは、悪意のある偽物のIMEサーバに接続しうる。悪意のあるアプリケーションが同じユーザアカウントで実行されると、そのようなシナリオから保護することができない。しかし、最低ラインは、異なるユーザアカウントで実行される悪意のあるユーザ/アプリケーションからセキュリティを保護すべきであるということである。いくつかのオペレーティングシステムは、IMEクライアントDLLが有効なIMEサーバに接続していることを知ることが可能な、プラットフォームに依存している方法を提供しているので、それを最大限利用することができる。その利用例を以下に示す。
1.IMEサーバはIPCのパス名を保持するファイルをロックする。オペレーティングシステムがファイルロックの所有者を知る方法を提供するならば、それを使用することができる。
Windows(登録商標)の場合、所有者を知るための文書化されていない方法が存在するようであるが信頼できないので、それは使用しない。
Macintosh(登録商標)の場合、そのようなAPIは存在しない。
Linux(登録商標)の場合、Linux(登録商標)のファイルロックは単に勧告のロックである。ファイルロックそれ自体は信頼できない。
2.オペレーティングシステムが、IPCの相手のプロセスIDを提供するならば、それを使用することができる。
Windows Vista(Windowsは登録商標)の場合、相手のプロセスIDを知るAPIが存在するので、それを使用することができる(http://msdn.microsoft.com/en-us/library/aa365446(VS.85).aspx)。
Windows XP(Windowsは登録商標)の場合、同等なAPIは存在しない。
Macintosh(登録商標)の場合、同等なAPIは存在しない。
Linux(登録商標)の場合、Unix Domainソケット(Unixは登録商標)を用いて相手のpidを知ることができる。/proc/<pid>/execを読み出すことによって、パスを知ることができる。
3.IPCを介してPIDを送信する。
Windows XP(Windowsは登録商標)、Macintosh(登録商標)は、相手のpidを知るためのサポートはないので、IPCを介してPIDを送信することができる。これは、不慮の攻撃を防止することができる。
<サーバ接続は単一であるべきである>
CreateNamedPipeのデフォルトパラメータを用いた、同じパス名を有する複数のNamedPipeサーバのインスタンス(プロセス)は許容される。これは致命的なセキュリティホールとなりうる。悪意のあるアプリケーションは、同じパス名を使用することによって偽物のIMEサーバを容易に生成することができる。複数のインスタンス生成を防止するために、Windows XP(Windowsは登録商標)以降にFILE_FLAG_FIRST_PIPE_INSTANCEフラグが導入された。詳細は
http://msdn.microsoft.com/en-us/library/aa365150(VS.85).aspx
を参照。Microsoft社によればフラグを設定することが強く推奨される。
http://support.microsoft.com/kb/308403/en
を参照。
<CreateNamedPipe()に適切なセキュリティ属性を渡す>
名前付きパイプは有効なユーザのみからアクセスされるべきである。有効なセキュリティ属性をCreateNamedPipe APIに渡す。図5に示すように、これは、ローカルシステム、管理者、および、現在のユーザからのアクセスを許可する。他のユーザからのアクセスは許可されない。MakeSecurityAttributes関数の実装を知るためには
http://s/?fileprint=//depot/google3/experimental/mozc/third_party/sandbox/security_attributes.cc
を参照。
CreateNamedPipe APIの呼び出しに関するプログラムコードの例を以下に示す。
SECURITY_ATTRIBUTES SecurityAttributes;
if (!sandbox::MakeSecurityAttributes(&SecurityAttributes)) {
LOG(ERROR) << "Cannot make SecurityAttributes";
return;
}
// Create a named pipe.
wstring wserver_address;
Util::UTF8ToWide(server_address.c_str(), &wserver_address);
handle_ = ::CreateNamedPipe(wserver_address.c_str(),
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED |
FILE_FLAG_FIRST_PIPE_INSTANCE,
PIPE_TYPE_MESSAGE |
PIPE_READMODE_MESSAGE |
PIPE_WAIT,
(num_connections <= 0 ?
PIPE_UNLIMITED_INSTANCES : num_connections),
sizeof(request_),
sizeof(response_),
0,
&SecurityAttributes);
if (handle_ == INVALID_HANDLE_VALUE) {
LOG(FATAL) << "CreateNamedPipe failed" << ::GetLastError();
return;
}
<なりすましを防止する>
名前付きパイプのなりすましを不可能にしなければならない。そうでなければ、悪意のあるIMEサーバはクライアント接続をなりすますことができ、クライアント権限で悪意のあるコードを実行することができる。名前付きパイプのなりすましを不可能にするために“SECURITY_SQOS_PRESENT|SECURITY_IDENTIFICATION|SECURITY_EFFECTIVE_ONLY”フラグをCreateFile APIに渡す。CreateFile APIの呼び出しに関するプログラムコードの例を以下に示す。
// Connecting to mozc server
handle_ = ::CreateFile(wserver_address.c_str(),
GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED |
SECURITY_SQOS_PRESENT |
SECURITY_IDENTIFICATION |
SECURITY_EFFECTIVE_ONLY,
NULL);
これらのフラグを渡すことで、悪意のあるIMEサーバはクライアント接続をなりすますことができない。
<セッション管理>
次に、本発明によるIMEサーバが複数のアプリケーションからの複数の変換リクエストをどのように管理するかを説明する。1つのアプリケーションは、現在の入力モード、現在の変換状態、等を保持する1つのセッションをオープンする。全てのセッションが互いに隔離されていることを保証しなければならない。
<セッション管理プロトコル>
IMEクライアントDLLは、最初に、セッションIDをIMEサーバに要求する。セッションはこのセッションIDを用いて管理される。例えば、キー入力イベント‘a’がセッションIDとともに送信される。IMEサーバは、セッションIDを見ることによってどのアプリケーション(セッション)が‘a’のキーを受信したかを知ることができる。もはや現在のセッションにアクセスする必要がないならば、IMEクライアントはDeleteSessionリクエストを呼び出すことができる。
IMEクライアント>CreateSession
IMEサーバ >Your session id is 123
IMEクライアント>SendKey 123 ‘a’
IMEサーバ >...
...
IMEクライアント>DeleteSession 123
セッションメッセージは、protocol buffer 2(オープンソースのプロトコルバッファ)を使用することによって平文のバイト列に符号化される。
<他のプロセスから自分のセッション情報を隠蔽する>
セッションIDは、他のアプリケーションから予測不可能であるべきである。そうでなければ、悪意のあるクライアントは、偽物のリクエストを送信し、間接的にセッション情報を編集することができる。IMEサーバは上述したCreateRandomSequence関数を用いてランダムなセッションID(符号なし64ビット整数)を生成する。総当たり攻撃によって有効なIDを取得することは可能であるが、予測可能なセッションID(連続したID、等)を使用するよりずっと安全である。
<DoS(Denial of Service)攻撃を防止する>
悪意のあるクライアントが膨大な数の偽物のCreateSessionリクエストを送信すると、IMEサーバはヒープメモリを消費し、結局、クラッシュする。そのような場合を防止するために、全てのセッションIDは、一種の固定のLRU(least recently used)キャッシュによって管理される。例えば、サイズは64に設定される。有効なセッションのサイズが64に到達すると、IMEサーバは最も古いセッションを削除する。この処理は、CreateSessionリクエストへの全てのDoS攻撃を常に阻止するとは限らないが、少なくとも意図しないメモリ消費を防止することができる。それに加えて、DoS攻撃を止めるために次の処理を追加することができる。
・CreateSessionが呼び出されたとき、1秒(1秒は任意である。)以内に他のCreateSessionを要求することができない。
・IMEクライアントが、30秒間、(SendKeyのような)リクエストを送信しないとき、セッションは自動的に削除される。この処理はゾンビセッションを消去する。
・IMEクライアントが、CreateSessionの後に、2分間、リクエストを送信しないとき、セッションは自動的に消去される。
・IMEクライアントDLLは、IMEサーバによってセッションが消去されたときでも、変換を維持するために十分にロバストであるべきである。
次に、移植性の課題を解決する観点から、第2実施例を説明する。
本発明では、IMEの機能を実現するために、クライアント−サーバモデルを採用する。その理由の1つは移植性である。本発明によるIMEサーバは、IMEのコアとなる機能をできる限り移植性を有するようにコーディングし、その機能を1つのプロセスに配置することによって、各種の動作環境(Windows(登録商標)、Macintosh(登録商標)、Linux(登録商標))で動作可能となり、オペレーティングシステムの機能を知る必要がなく、それ自身の方法で機能を提供する。IMEサーバのいくつかのルーチンは、IMEサーバのインタフェースを覆い隠し、各々のオペレーティングシステムのIME APIを処理する。
IMEサーバは全てのIME機能を処理する。これは、ローマ字−かな変換(または他の入力方法)、F7のようなメタコマンド、かな−漢字変換、ユーザ履歴学習、注釈、予測入力、および、他の任意の機能を提供する。IMEクライアントはユーザとの相互作用を処理する。IMEクライアントはイベントリスナおよびGUI表示機能の役割を果たすと考えることができる。
すなわち、本発明によるIMEサーバはプラットフォームに依存せず、可能な限り全てを処理する機能豊富なサーバ(fat server)である。これに対し、IMEクライアントは、プラットフォーム固有のフレームワーク(例えば、Windows(登録商標)についてIMM32またはTSF)を用いて実装され、状態のないイベントリスナおよびGUI表示機能の役割を果たし、全てのキー入力イベントをIMEサーバに送信し、IMEサーバから返送される表示情報を用いて表示するシンクライアントである。
ユーザがテキストを入力するテキストアプリケーションがただ1つであっても、ユーザのデスクトップ上に複数のアプリケーションが存在可能であり、ユーザは、しばしば、テキストを入力している間でもフォーカスするアプリケーションを切り換える。従って、各テキストアプリケーションについての入力状態を保持することが望ましい。本発明によるIMEサーバは、複数のリクエストを受け入れ、それらを処理することができる。各々の入力状態を“セッション”と呼び、セッションは番号であるセッションIDによって識別される。
本発明によるIMEサーバは、キープアライブ接続をサポートしない。本発明によるIMEクライアントは、IMEサーバへの接続を生成し、コマンドを送信し、応答を受信し、そして、切断する。従って、各々のコマンドはセッションIDを含まなければならない。1つの例外は“CreateSession”と呼ぶコマンドである。IMEクライアントがセッションIDなしでこのコマンドを呼び出すと、IMEサーバはセッションを生成し、セッションIDをIMEクライアントに返送する。
<サーバプロセスの起動>
IMEクライアントはIMEサーバを共有する。IMEサーバがまだ起動されていないと、IMEクライアントはIMEサーバを起動する。各々のユーザは、各々のIMEサーバに接続する。ユーザはIMEサーバを共有しない。複数のコンピュータは、そのうちの1つのコンピュータ上のIMEサーバを共有しない。従って、クライアント−サーバ接続は1つのコンピュータ内で閉じている。1つのコンピュータが複数のデスクトップを有するときでも、1つのIMEサーバが存在する。IMEサーバは、ユーザ履歴のようなデータをユーザのホームディレクトリに保存することが可能である。しかし、この場合、例えば、NFS(ネットワークファイルシステム)を使用して複数のコンピュータの間でそのホームディレクトリを共有するようなことは行うべきでない。
・1ログインユーザに対して、1つのIMEサーバプロセス。
・1つのコンピュータ上の複数のデスクトップに対して、1つのIMEサーバプロセス。なお、1つのユーザプロファイルに2つのコンピュータがアクセスした場合は検討を要する。
・1つのIMEサーバプロセスに対して、1つの変換部インスタンス。すなわち、変換部は単一のものである。
・1サーバプロセスに対して、複数接続。
・接続はワンショットであり、キープアライブは行わない。
・コンテキスト(セッション)はセッションIDによって管理される。
・2つのアプリケーションが同じセッションIDを使用するとき、IMEサーバは1つのスレッドなので、セッションIDをロックする必要はない。
・IMEサーバは単一のスレッドである。
・変換部における全てのメソッドはスレッドセーフでなければならない。排他的な動作が存在するならば、ロックを行う。
このIMEアーキテクチャは、“IMEクライアント”および“IMEサーバ”の2つのコンポーネントからなる。IMEクライアントおよびIMEサーバは、異なるコンテキスト、例えば、異なるプロセス、および/または、異なるコンピュータで実行される。
<IMEクライアント>
IMEクライアントは、各々のオペレーティングシステムが提供するIMEフレームワーク上で実現される。IMEクライアントが行うのは、ユーザのキー入力イベント(例えば、“a”のキーが押された。)を取得すること、このキー入力イベントをIMEサーバに送信すること、IMEサーバはクライアントが送信したキー入力イベントに対応する表示情報(例えば、下線を付して日本語“あ”を表示せよ。)を返送するので、それを表示すること、のみである。IMEクライアントは状態を管理しない。
本発明によるIMEクライアントの役割は限られているので、IMEフレームワークへの依存度は他のIMEクライアントよりずっと小さい。本発明によるIMEクライアントの実装は他のIMEクライアントより容易である。
IMEクライアントは、ユーザが適切な候補を選択する候補のリストを表示する。IMEクライアントは、このリストを表示するために任意の実装を使用することができる。ウェブアプリケーションについては、Ajax(Asynchronous JavaScript + XML(JavaScriptは登録商標))およびJavaScript(JavaScriptは登録商標)を使用することができる。
<IMEサーバ>
IMEサーバは、IMEクライアントと異なるプロセスで実行される。接続のためにRPCを使用するならば、IMEサーバは異なるコンピュータで実行されうる。IMEサーバは、任意のIMEフレームワーク上で実装する必要がないので、IMEサーバの実装はより移植性が高くなる。異なるプラットフォーム上で動作する、異なるIMEクライアントは同一のIMEサーバに接続することができる。IMEサーバは、全てのキー入力イベントを処理し、表示情報をIMEクライアントに返送する。表示情報は、アプリケーションに表示すべき現在の(部分的に)変換された日本語テキストおよび候補ウィンドウの内容を含む。
ここで、IMEクライアントとIMEサーバの間のプロトコルシーケンスの一例を示す。セッションIDは異なるIMEクライアントを識別するために使用される。
1.IMEクライアント→IMEサーバ: 新たなセッションを生成せよ。
2.IMEサーバ→IMEクライアント: OK。あなたのセッションIDは123。
3.IMEクライアント→IMEサーバ: ‘a’が押された。IDは123。
4.IMEサーバ→IMEクライアント: 現在の行に下線を付して“あ”と表示せよ。
5.IMEクライアント→IMEサーバ: ‘i’が押された。IDは123。
6.IMEサーバ→IMEクライアント: 現在の行に下線を付して“あい”と表示せよ。
7.IMEクライアント→IMEサーバ: ‘ ’(空白)が押された。IDは123。
8.IMEサーバ→IMEクライアント: 現在の行に“愛”と表示せよ。
9.IMEクライアント→IMEサーバ: ‘ ’(空白)が押された。IDは123。
10.IMEサーバ→IMEクライアント: 現在の行に“愛”と表示し、内容が[愛、合、あい、相、...]である候補ウィンドウを表示し、第1候補を強調表示せよ。
11.IMEクライアント→IMEサーバ: “down”キーが押された。IDは123。
12.IMEサーバ→IMEクライアント: 現在の行に“合”と表示し、内容が[合、あい、相、...]である候補ウィンドウを表示し、第2候補を強調表示せよ。
13.IMEクライアント→IMEサーバ: “enter”キーが押された。IDは123。
14.IMEサーバ→IMEクライアント: アプリケーションにテキスト“合”を送信せよ。
15.・・・
16.IMEクライアント→IMEサーバ: セッション123を消去する。
17.IMEサーバ→IMEクライアント: OK。終了。
ステップ1において、IMEクライアントは新たなセッションを生成する。IMEサーバは新たなセッションIDを発行し、これは各IMEクライアントを識別するために使用される。ユーザが‘a’のキーを押すとその情報が直接にサーバに送信される。IMEサーバは、日本語のひらがな“あ”を現在の行に表示すべきであることを返送する。続いて、ユーザが‘i’のキーを押すと、ステップ6において、IMEサーバは“あい”を表示すべきであることを返送する。“あい”はステップ3およびステップ5で送信されたユーザのキー入力列に対応する。すなわち、“ai”が“あい”に対応する。
IMEクライアントについて、プロトコルは状態がないという意味で、ステップ3およびステップ5は全く独立である。日本語IMEにおいて、‘ ’(空白)は“変換”キーに割り当てられる。ステップ8において、IMEサーバは、発音が“ai”である、最も可能性のある日本語テキストを返送する。ステップ9において、ユーザは、再度、空白を押すことによって全ての可能性のある候補を展開することを試みる。ステップ10において、IMEサーバは同じ発音“ai”を有する複数の全ての候補のリストを返送する。
他の言語についての新たなIMEの実装は、上述したアーキテクチャを用いて容易である。言語に依存する全ての部分はIMEサーバ内に実装されるので、IMEクライアントの実装を再利用することができる。IMEクライアントの実装を再利用することは移植性のために良い。
以上、IPCを用いたクライアント−サーバモデルの例を説明し、図1にIPCに基づくアーキテクチャを示したが、IPC部分をRPCで置換することができる。
次に、バージョンの更新に関する課題を解決する観点から、第3実施例を説明する。
IMEクライアントとIMEサーバに対して、IMEのバージョンとプロトコルのバージョンを付与する。IMEクライアントとIMEサーバの一方のプロトコルのバージョンが更新されると、これらは通信することができない。プロトコルのバージョンの更新は、IMEのバージョンの更新と比較して頻度が少ない。すなわち、IMEのバージョンが更新されても、プロトコルのバージョンが更新されない場合も存在する。しかし、プロトコルのバージョンが更新されると、IMEのバージョンも更新される。
プロトコルのバージョンは、例えば、ファイル名「.session.ipc」のような.ipcファイルに保存される。.ipcファイルはprotobufでシリアライズしたメッセージである。プロトコルバッファ(http://code.google.com/p/protobug/)を更新したい場合、ipc/ipc.hファイルを修正する。列挙されたIPC_PROTOCOL_VERSIONフィールドが存在する。IMEクライアントおよびIMEサーバのバージョンは、例えば、バイナリ実行形式ファイル内にエンコードされる。.ipcファイルにもIMEクライアントおよびIMEサーバのバージョンがエンコードされる。
本発明によるIMEクライアントは、動作しているIMEサーバとのプロトコルの互換性、動作しているIMEサーバのバージョンをチェックする。IMEクライアントは、この互換性およびバージョンに基づいて動作を変更する。次の4つのケースがありうる。
<ケース1>
IMEクライアントのバージョンがIMEサーバのバージョンと同じである場合、これは通常の場合であり、特別な動作はしない。
<ケース2>
IMEクライアントのバージョンがIMEサーバのバージョンより新しい場合、IMEクライアントはIMEサーバを再起動する。すなわち、IMEサーバプログラムの実行を停止させ、新たなプログラムバージョンのIMEサーバプログラムをメモリに読み込ませ、実行させる。
<ケース3>
IMEクライアントのバージョンがIMEサーバのバージョンより古く、プロトコルが互換性を有する場合、IMEクライアントはIMEサーバとの接続を維持する。
<ケース4>
IMEクライアントのバージョンがIMEサーバのバージョンより古く、プロトコルが互換性を有さない場合、IMEクライアントはIMEサーバとの接続を中止する。
ケース1、2、3の場合、IMEサーバを安全に更新することができる。ケース4の場合、古いバージョンのIMEクライアントは新たなバージョンのIMEサーバに接続できないという問題を有する。しかし、これは、通常の更新に対して稀なケースとすることができる。新たなバージョンのIMEサーバが新たなバージョンおよび古いバージョンの両方のプロトコルをサポートするならば、ケース4は生じない。
例えば、コンピュータの記憶装置に保存されたIMEの実行形式ファイル(IMEクライアントプログラム(一形態としてDLL)とIMEサーバプログラム)が更新された後にアプリケーションプログラムが実行されると、新たなバージョンのIMEクライアントプログラムが実行される。新たなバージョンのIMEクライアントは、IMEサーバのバージョン、および、プロトコルのバージョンをチェックする(図6(a))。
新たなバージョンのIMEクライアントは、動作しているIMEサーバのバージョンが古いことを検出すると、古いバージョンのサーバを停止させ、新たなバージョンのIMEサーバを起動させる(図6(b))。
一方、IMEの実行形式ファイルの更新以前からアプリケーションとともに動作しているIMEクライアントは、動作しているIMEサーバのバージョンがIMEクライアントのバージョンより新しいことを検出すると、そのIMEクライアントは、IMEサーバのプロトコルのバージョンを参照してプロトコルの互換性をチェックする(図6(c))。
プロトコルが互換性を有するならば、そのIMEクライアントは新たなバージョンのIMEサーバに接続する(図6(d))。そうでないならば、IMEクライアントは接続を中止し、ユーザにバージョンの不一致を知らせる(図6(e))。
なお、図6において、「古いクライアント(サーバ)」とは、IMEのバージョンが古いIMEクライアント(サーバ)プログラムをコンピュータ上で動作させたもの、「新しいクライアント(サーバ)」とは、IMEのバージョンが新しいIMEクライアント(サーバ)プログラムをコンピュータ上で動作させたものを意味する。
上記の処理を、実行形式ファイルの更新において、プロトコルのバージョンとIMEのバージョンが更新された場合と、IMEのバージョンのみ更新された場合に分けて詳細に説明する。
<プロトコルのバージョンとIMEのバージョンが更新された場合>
1.Omaha(プログラムの新バージョンを自動でインストールするGoogle社のプログラム)は、コンピュータの記憶装置に保存されているIMEクライアントDLLおよびIMEサーバプログラムを移動してファイル名を変更する。新たなIMEクライアントDLLおよびIMEサーバプログラムがコンピュータの記憶装置に保存される。
2.新たに起動されたアプリケーションは、新たなバージョンのIMEクライアントDLLをメモリに読み込む。
3.IMEクライアントがCreateSessionコマンドを送出するとき、.ipcファイルをチェックすることによってプロトコルのバージョンの不一致を検出することができる。
4.IMEクライアントのバージョンがIMEサーバ(実行中のIMEサーバ)のバージョンより新しい場合、IMEクライアントはIMEサーバをユーザに気付かれずに再起動する。再起動はCreateSessionコマンドを送出するときのみ実行される。
5.再起動後もプロトコルのバージョン、あるいは、IMEのバージョンが変わらないならば、エラーを示すダイアログウィンドウをコンピュータのディスプレイに表示する。
6.古いバージョンのIMEクライアントDLLをコンピュータのメモリに読み込んだ元のアプリケーションは新たなバージョンのIMEサーバと通信することができない。この場合、すなわち、IMEクライアントのプロトコルのバージョンがIMEサーバのバージョンより古い場合、IMEクライアントはエラーを示すダイアログウィンドウをコンピュータのディスプレイに表示する。
<IMEのバージョンのみ更新された場合>
1.Omahaは、コンピュータの記憶装置に保存されているIMEクライアントDLLおよびIMEサーバプログラムを移動してファイル名を変更する。新たなIMEクライアントDLLおよびIMEサーバプログラムがコンピュータの記憶装置に保存される。
2.新たに起動されたアプリケーションは、新たなバージョンのIMEクライアントDLLをメモリに読み込む。
3.IMEクライアントがCreateSessionコマンドを送出するとき、.ipcファイルをチェックすることによってプロトコルのバージョンの不一致を検出することができる。
4.プロトコルのバージョンが互換性を有するので、IMEクライアントはIMEサーバを安全に再起動することができる。再起動はCreateSessionコマンドを送出するときのみ実行される。
5.再起動後もIMEサーバのバージョンが変わらないならば、エラーを示すダイアログウィンドウをコンピュータのディスプレイに表示する。
6.古いバージョンのIMEクライアントDLLをコンピュータのメモリに読み込んだ元のアプリケーションは古いバージョンのIMEクライアントプログラムを使用する。これは、他のアプリケーションがCreateSessionコマンドを送出するときIMEサーバのみ更新され、すなわち、ユーザが何かキー入力している間はIMEサーバが更新されないだけであるので、大きな問題ではない。また、互換性のあるプロトコルのバージョンはクライアント−サーバ間の通信が破壊されないことを保証する。
上記では、クライアントとサーバの対応関係を特定するために、プログラムのバージョン、プロトコルのバージョンを使用したが、他の情報を用いてもよい。
次に、IMEサーバの異常終了に関する課題を解決する観点から、第4実施例を説明する。
本発明は、IMEサーバを再起動する手段、IMEサーバの再起動を検出する手段、IMEサーバが再起動されたとき、IMEクライアントから以前のキー入力列を送信する手段、1回以上IMEサーバがクラッシュしたキー入力列を送信することによって引き起こされる無限ループを防止する手段、IMEサーバをクラッシュさせるキー入力列を記録する手段を備える。
本発明によるクライアント−サーバ型のIMEにおいて、IMEサーバは状態を認識し、キー入力イベントを受信して表示情報を返送する。IMEクライアントは状態がなく、ユーザの各々のキー入力イベントを送信してサーバから表示情報を受信し、それを適切なユーザインタフェースに表示する。ユーザがIMEをターンオンしたとき、IMEサーバは動作していなければならず、IMEサーバが異常終了したときでも、IMEサーバはIMEクライアントから再起動される。本発明によるIMEクライアントは、入力セッションの間、キー入力列を保持し、IMEサーバが再起動されたとき、それを再送する。
本発明は、IMEに利用することができる。
1、2、3 ・・・ アプリケーション

Claims (4)

  1. コンピュータによって実施される方法であって、
    インプットメソッドエディタ(IME)クライアントにおいてキーイベントを生成するステップであって、前記IMEクライアントは、前記IMEクライアントがIMEサーバへ発行する要求のみを保存するとともに各キーイベントに対して前記IMEサーバへの要求を発行するステートレスなIMEクライアントである、ステップと、
    前記IMEクライアントがキーイベント列の中の前記キーイベントを記録するステップであって、前記キーイベント列は、前記キーイベントと、前記IMEサーバへ以前に送信された少なくとも1または2以上の以前のキーイベントとを保存する、ステップと、
    前記IMEクライアントと通信するIMEサーバへ前記キーイベントを送信するステップであって、前記IMEサーバは、前記IMEサーバおよび前記IMEクライアント間の通信セッションの要求および応答の両方を保存するステートフルなサーバである、ステップと、
    前記IMEクライアントにおいて、前記IMEサーバが機能を停止したことを判定するステップと、
    前記IMEサーバが機能を停止したことの判定に応答して、ステートフルなサーバである第2のIMEサーバとのセッションを確立するステップと、
    前記セッションの確立後に、前記記録されたキーイベント列を前記第2のIMEサーバに送信するステップとを有する方法。
  2. 前記第2のIMEサーバは、前記IMEサーバを再起動することにより作られる請求項1に記載のコンピュータによって実施される方法。
  3. 異常終了の結果として、前記IMEサーバが機能を停止する請求項1に記載のコンピュータによって実施される方法。
  4. 前記キーイベント列を保持するステップをさらに有する請求項1に記載のコンピュータによって実施される方法。
JP2013235738A 2013-11-14 2013-11-14 インプットメソッドエディタ Active JP5640138B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2013235738A JP5640138B2 (ja) 2013-11-14 2013-11-14 インプットメソッドエディタ

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2013235738A JP5640138B2 (ja) 2013-11-14 2013-11-14 インプットメソッドエディタ

Related Parent Applications (1)

Application Number Title Priority Date Filing Date
JP2009270625A Division JP5415918B2 (ja) 2009-11-27 2009-11-27 インプットメソッドエディタ

Publications (2)

Publication Number Publication Date
JP2014078243A JP2014078243A (ja) 2014-05-01
JP5640138B2 true JP5640138B2 (ja) 2014-12-10

Family

ID=50783452

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2013235738A Active JP5640138B2 (ja) 2013-11-14 2013-11-14 インプットメソッドエディタ

Country Status (1)

Country Link
JP (1) JP5640138B2 (ja)

Also Published As

Publication number Publication date
JP2014078243A (ja) 2014-05-01

Similar Documents

Publication Publication Date Title
US9635138B2 (en) Client-server input method editor architecture
US10515208B2 (en) Isolation and presentation of untrusted data
CA2761563C (en) Annotating virtual application processes
US10069832B2 (en) Ephemeral applications
US7496576B2 (en) Isolated access to named resources
US9342329B2 (en) Method and system for cross-operating systems execution of software applications
KR101453742B1 (ko) 웹 어플리케이션 실행을 위한 보안 제공 장치 및 방법
WO2010111147A2 (en) Input content to application via web browser
WO2014101393A1 (zh) 应用实现方法及装置
KR20110123867A (ko) 웹 어플리케이션 실행 장치 및 그의 웹 어플리케이션 관리 방법
JP4668698B2 (ja) インストールされているアプリケーションによって要求されるソフトウェア制御サービスのイネーブル化
KR101482151B1 (ko) 웹 어플리케이션 실행 장치 및 방법
JP5415918B2 (ja) インプットメソッドエディタ
CN102467632B (zh) 一种浏览器隔离使用的方法
JP5640138B2 (ja) インプットメソッドエディタ
JP5745599B2 (ja) インプットメソッドエディタ
JP5640137B2 (ja) インプットメソッドエディタ
KR101563657B1 (ko) 샌드박싱 된 윈도우 응용프로그램 외부로의 데이터 전송방법
Veeramani Smart clients versus web forms
CN112667997A (zh) 一种禁用Windows系统浏览器的方法和装置
CN116955294A (zh) 文件预览方法、装置、电子设备及存储介质
JP2001290783A (ja) 遠隔実行コンピュータシステム

Legal Events

Date Code Title Description
A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20140917

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20140929

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20141027

R150 Certificate of patent or registration of utility model

Ref document number: 5640138

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

RD02 Notification of acceptance of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: R3D02

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

S533 Written request for registration of change of name

Free format text: JAPANESE INTERMEDIATE CODE: R313533

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250