Net秘書君仕様書 ver 0.30

最初に

通信プロトコル

概要

  • 通信プロトコルはXMLを使用する。
  • エンコード方法は全てShift-JISとする。
  • アトリビュート名、エレメント名は全てアルファベット小文字とハイフン、アンダースコアのみで構成される
  • サーバーの状態は「未認証」->「ファイル選択待ち」->「ファイル選択済み」と遷移する。
  • クライアントの状態は「未認証」->「ファイル選択待ち」->「ファイル選択済み」と遷移する。

コマンド一覧

送信コマンド一覧
種別項目typeサーバクライアント
認証
certification
認証準備Preparation×
サーバ認証Server×
ファイル認証File×
認証結果通知Result
情報取得
information
ファイル一覧取得Filenames×
サーバ情報取得Server×
クライアント情報取得Client×
情報通知Result
ファイル情報操作
data
ファイル情報取得Verify×
ファイル情報更新Modify×
操作結果通知Result×
ファイル操作
files
ファイル追加Add×
ファイル削除Delete×
操作結果通知Result×
通知
notice
ファイル更新通知Updated×
ファイル削除通知Deleted×
切断Disconnect
操作
command
終了Exit×
コンフィグConfig×
エラー
Error
XMLエラーXML
権限エラーCompetence
状態エラーState
内部エラーInternal
そのほかMisc

サーバ、クライアント共に 「未認証」、「ファイル選択待ち」、「ファイル選択済み」状態を1,2,3とすると、 以下の状態のときにのみコマンドを受け付ける。
受付不可能な通信が来た場合には状態エラーを返す。

受け入れ可能コマンド一覧
種別項目typeサーバクライアント
認証
certification
認証準備Preparation×1
サーバ認証Server1×
ファイル認証File2,3×
認証結果通知Result11,2,3
情報取得
information
ファイル一覧取得Filenames2,3×
サーバ情報取得Server2,3×
クライアント情報取得Client×2,3
情報通知Result2,32,3
ファイル情報操作
data
ファイル情報取得Verify3×
ファイル情報更新Modify3×
操作結果通知Result×3
ファイル操作
files
ファイル追加Add2,3×
ファイル削除Delete2,3×
操作結果通知Result×2,3
通知
notice
ファイル更新通知Updated×3
ファイル削除通知Deleted×3
切断Disconnect1,2,31,2,3
操作
command
終了Exit2,3×
コンフィグConfig2,3×
エラー
Error
XMLエラーXML1,2,31,2,3
権限エラーcompetence1,2,31,2,3
状態エラーState1,2,31,2,3
内部エラーInternal1,2,31,2,3
そのほかMisc1,2,31,2,3

注意事項

各セッションに先立ってXML宣言
<?xml version="1.0" encoding="Shift-JIS"?>
が送られる。

トップレベルエレメント

certification エレメント

持ちうるアトリビュート
  • type(必須)
持ちうるエレメント
  • type(省略可 type="Preparation"のときのみ複数持ちうる)
  • file(type="File"のときのみ存在する。省略不可)

certificiateエレメントによる認証が成功した場合は
<certificate type="Result" result="Success"/>
を、失敗した場合には
<certificate type="Result" result="Failure" desc="失敗原因"/>を返す。

certificiate の交換によりサーバー側/クライアント側の状態はファイル選択待ち状態またはファイル選択済み状態へ遷移する。

認証準備 type="Preparation"

このとき、certificiateエレメントは1つ以上のtypeエレメントを持つ。
これらのtypeエレメントはtypeアトリビュートとしてサーバーが受け入れ可能な認証方法を返す。

これをクライアントがエラー無く受け入れた場合、クライアントの状態はファイル選択待ち状態へ遷移する。
例:
サーバ
<certificate type="Preparation">
<type type="IP" />
<type type="Plain" />
<type type="Challenge/Response/MD5" />
<challenge>CHALLENGE_STRING</challenge>
</type>
...
</certificate>
クライアント
---成功時
無し(直ちにサーバ認証を開始)
---失敗時
<certificate type="Result" result="Failure" desc="" />

サーバ認証 type="Server"

このとき、certificiateエレメントは一つのtypeエレメントを持つ。
これらのtypeエレメントはPreparationにてサーバーから渡された受け入れ可能な認証方法のうち、一つに対しての認証情報を持つ。
これをサーバがエラー無く受け入れた場合、サーバの状態はファイル選択待ち状態へ遷移する。
例:
クライアント
<certificate type="Server">
{|<type type="IP">
<username>USER_NAME</username>
</type>
|<type type="Plain">
<username>USER_NAME</username>
<password>PASSWORD_STRING</response>
</type>
|<type type="Challenge/Response/MD5">
<username>USER_NAME</username>
<response>RESPONSE_STRING</response>
</type>
|...
}
</certificate>
サーバ
---成功時
<certificate type="Result" subtype="Server" result="Success" permission="User/Administrator" />
---失敗時
<certificate type="Result" subtype="Server" result="Failure" desc="RESULT_MESSAGE" />

ファイル認証 type="File"

このとき、certificiateエレメントは一つのtypeエレメントを持つ。
これらのtypeエレメントはPreparationにてサーバーから渡された受け入れ可能な認証方法のうち、一つに対しての認証情報を持つ。
また、このときcertificiateエレメントはfileエレメントを一つ持ち、そのnameアトリビュートとして選択するファイルのファイル名を持つ。

これをサーバがエラー無く受け入れた場合、サーバの状態はファイル選択済み状態へ遷移する。
サーバーにfileエレメントで指定されたファイルが存在しない場合でもサーバーは認証エラーを返す。
例:
クライアント
<certificate type="File">
<file name="FILENAME.EXTENTION" />
{<type type="IP" />
|<type type="Plain">
<username>USER_NAME</username>
<password>PASSWORD_STRING</response>
</type>
|<type type="Challenge/Response/MD5">
<username>USER_NAME</username>
<response>RESPONSE_STRING</response>
</type>
|...
}
</certificate>
サーバ
---成功時
<certificate type="Result" subtype="File" result="Success" permission="Read/Write" />
---失敗時
<certificate type="Result" subtype="File" result="Failure" desc="RESULT_MESSAGE" />

information エレメント

持ちうるアトリビュート
  • type(必須)
  • subtype(type="Result" のときのみ必須。対応するinformationのtypeを持つ。)
持ちうるエレメント
  • file(subtype="Filenames"のときのみ0以上の数存在する。)
  • version(subtype="Server"/"Client"のとき存在する。major,minor,revisionのアトリビュートを持つ)

informationエレメントによる情報取得が成功した場合は
<information type="Result" result="Success" subtype="SUBTYPE" >
...
</information>
を、失敗した場合には
<information type="Result" result="Failure" subtype="SUBTYPE" desc="失敗原因" />
を返す。

information の交換によってはサーバー側/クライアント側の状態は変化しない。
information の受け入れ可能状態はサーバ/クライアント共にファイル選択待ち状態/ファイル選択済み状態のときのみである。

ファイル名一覧取得 type="Filenames"

このとき、informationエレメントはエレメントをもたない。
これをサーバがエラー無く受け入れた場合、サーバは読み取り可能なファイルの一覧を返す。
例:
クライアント
<information type="Filenames" />
サーバ
---成功時
<information type="Result" result="Success" subtype="Filenames" >
<file name="FILENAME0.EXTENTION">
<file name="FILENAME1.EXTENTION">
...
</information>
---失敗時
<information type="Result" result="Failure" subtype="Filenames" desc="失敗原因" />

サーバ情報取得 type="Server"

このとき、informationエレメントはエレメントをもたない。
これをサーバがエラー無く受け入れた場合、サーバはサーバ情報を返す。

例:
クライアント
<information type="Server" />
サーバ
---成功時
<information type="Result" result="Success" subtype="Server" >
</version major="0" minor="0" revision="0" >
そのほか適当に・・・
</information>
---失敗時
<information type="Result" result="Failure" subtype="Server" desc="RESULT_MESSAGE" />

クライアント情報取得 type="Client"

このとき、informationエレメントはエレメントをもたない。
これをクライアントがエラー無く受け入れた場合、クライアントはクライアント情報を返す。
サーバ
<information type="Client" />
クライアント
---成功時
<information type="Result" result="Success" subtype="Client" >
</version major="0" minor="0" revision="0" >
そのほか適当に・・・
</information>
---失敗時
<information type="Result" result="Failure" subtype="Client" desc="RESULT_MESSAGE" />

data エレメント

持ちうるアトリビュート
  • type(必須)
  • subtype(type="Result" のときのみ必須。対応するdataのtypeを持つ。)
持ちうるエレメント
  • schs(必須)

dataエレメントによる情報取得が成功した場合は
<data type="Result" result="Success" subtype="SUBTYPE" >
...
</data>
を、失敗した場合には
<data type="Result" result="Failure" subtype="SUBTYPE" desc="失敗原因" />
を返す。

data の交換によってはサーバー側の状態は変化しない。
data の受け入れ可能状態はファイル選択済み状態のときのみである。

ファイル情報取得 type="Veirfy"

このとき、dataエレメントはschsエレメントを一つだけ持つ。
これをサーバがエラー無く受け入れた場合、サーバはschs.oldidからの差分データを返す。
これをサーバのデータを齟齬が発生した場合、サーバはresult="Failure"を返す。
例:
クライアント
<data type="Verify">
<schs baseage = ローカルに保存されているAge oldid = ローカルに保存されている最新のSchsID />
</data>
サーバ
SchsID認証成功 SchsID認証失敗
動作 ・CAgeからSAgeまでのデータを送る。 ・データ衝突を通知する。

例:schs.baseage=15でVerfyが来た場合

SAgeが15より大きく、SAgeに関連付けられているSchsIDがクライアントからきたschs.oldidと等しい場合
対応するdata.type="Result" は返らない。
 注意:これに呼応してnotice.type="Updated"がサーバから送信される。
 これが実質的に返信である。
SAgeが15であり、SAgeに関連付けられているSchsIDがクライアントからきたschs.oldidと等しい場合
対応するdata.type="Result" は返らない。
 注意:これに呼応してサーバが内容を持たないnotice.type="Updated"を送信するか、あるいは何も送信しないかは実装依存である。
SAge15が15未満であるか、以上であるがSAge15に関連付けられているSchsIDがクライアントからきたschs.oldidと異なる場合
 注意:これに呼応して以下のnotice.type="Updated"がサーバから送信される。
 これが実質的に返信である。
<?xml version="1.0" encoding="Shift-JIS"?>
<notice type="Updated">
<schs type="Disagreement Occurred">/
</notice>


ファイル情報更新 type="Modify"

このとき、dataエレメントはschsエレメントを一つだけ持つ。
これをサーバがエラー無く受け入れた場合、サーバはサーバ情報を返す。

例:
クライアント
<data type="Modify">
<schs baseage = ローカルに保存されているAge oldid = ローカルに保存されている最新のSchsID newid = 新たに作成したSchsID >
1つ以上のsch(新しい/変更されたデータ)
</schs>
</data>
サーバ
サーバーはModifyセッションを受信したとき、以下の表の動作を行う。
動作は大きく分けて、
1.Verifyセッションと同じ動作
2.Modifyで送られてきたデータに対する返答
よりなる。
よってbaseageを同じとする Varify + Modify は Modifyのみの場合とほぼ同一の動作を行うことになる。
これはModifyセッションは暗黙のうちにbaseageを同じくするVerifyセッションを含み、それが先立って処理されることを表す。
ただし、暗黙のVerifyが失敗しても、それに対応するdata.type="Result"は返さない。

表 受信したModifyセッションとサーバの動作
Schs認証成功:CAge<SAge Schs認証成功:CAge=SAge Schs認証失敗
初見のUIDのみが含まれる場合 ・CAgeからSAgeまでのデータをNoticeで送る。
・SAge++
・予定をSAgeで登録する ・CommitされたスケジュールのIDをdata.type="Result"で送信する。
・SAge++
・予定をSAgeで登録する
・CommitされたスケジュールのIDをdata.type="Result"で送信する。
・データ衝突を通知する。
すでにサーバに存在するUID ・下表 既知のUIDを持つスケジュールが来たときの動作へ ・データ衝突を通知する。


表 既知のUIDを持つスケジュールが来たときの動作
CAgeからSAgeまでの間にクライアントから来たUIDと同じUIDを持つ予定の変更/削除が
すべてのUIDついてある 一部のUIDについてある ない
・CAgeからSAgeまでのデータをNoticeで送る。
・AbortされたスケジュールのIDをdata.type="Result"で送る。
・CAgeからSAgeまでのデータをNoticeで送る。
・SAge++
・Commit/AbortされたスケジュールのIDをdata.type="Result"で送る。
・CAgeからSAgeまでのデータをNoticeで送る。
・SAge++
・CommitされたスケジュールのIDをdata.type="Result"で送る。

例:schs.baseage=16でModifyが来た場合


1.暗黙のVerifyを処理する。ここでSchsIDの齟齬が発生していた場合は6へ
2.schs.baseage=15でVerifyがきた場合と同じnotice.type="Updated"が返る。
3.サーバ内でAge=15からSAgeまでに登録されているデータと送られてきたデータのUIDを比較する。
4.すべての送られてきたデータがAge=15からSAgeまでの間に変更されていた場合以外はSAgeが1足される
5.データが保存される。
6.以下のdata.type="Result"が返る。
7.Commitedの予定があった場合は同じファイルを参照している各クライアントにnotice.type="Updated"が送信される。

以下の各返信に先立ち、暗黙のVerifyに対応するnotice.type="Upadated/Deleted"が送信される。
ただし、SAge=schs.baseageでNoticeが必要ない場合は送信されない

Sageが15未満であるか、SAgeが15以上であるがSAge15に関連付けられているSchsIDがクライアントからきたschs.oldidと異なる場合
</notice>
<?xml version="1.0" encoding="Shift-JIS"?>
<data type="Result" subtype="Modify" result="Failure" desc="Modify Ignored"/>
</data>

SAgeが15以降でuid="TestUID1" uid="TestUID2" が共に変更されていなかった場合
<?xml version="1.0" encoding="Shift-JIS"?>
<data type="Result" subtype="Modify" result="Success">
<schs baseage = "15" newage = 更新後のSAge newid="NewSchsID">
<sch uid= "TestUID1" action = "Commited" />
<sch uid= "TestUID2" action = "Commited" />
</schs>
</data>

*NewSchsIDはクライアントよりschs.newageとして送られて、更新後のSAgeと関連してサーバに保存されたUIDである。

SAge15が以降でuid="TestUID1" が変更/削除されており、 uid="TestUID2"が変更されていなかった場合
<?xml version="1.0" encoding="Shift-JIS"?>
<data type="Result" subtype="Modify" result="Success">
<schs baseage = "15" newage = 更新後のSAge newid="NewSchsID">
<sch uid= "TestUID1" action = "Aborted" />
<sch uid= "TestUID2" action = "Commited" />
</schs>
</data>

*NewSchsIDはクライアントよりschs.newageとして送られて、更新後のSAgeと関連してサーバに保存されたUIDである。

SAge15が以降でuid="TestUID1" usi="TestUID2" が共に変更/削除されていた場合
<?xml version="1.0" encoding="Shift-JIS"?>
<data type="Result" subtype="Modify" result="Success">
<schs baseage = "15" newage = SAge newid="NewSchsID">
<sch uid= "TestUID1" action = "Aborted" />
<sch uid= "TestUID2" action = "Aborted" />
</schs>
</data>

*NewSchsIDはSAgeと関連付けられてサーバに保存されていたSchsIDである。
 これは先立つnotice.type="Updated"(があれば)に指定されたschs.newidと同一である。
 この場合(すべてのModify Schがアボートされたとき)ではSAgeは更新されないことに注意。

ファイルが削除されてしまっていた場合
<?xml version="1.0" encoding="Shift-JIS"?>
<data type="Result" subtype="Modify" result="Success">
<schs baseage = "15" newage ="" newid="">
<sch uid= "TestUID1" action = "Aborted" />
<sch uid= "TestUID2" action = "Aborted" />
</schs>
</data>

*NewSchsID、newageは""となる。
 先立つnotice.type="Deleted"がファイルの削除を通知しているので、
 ここでは特に削除に関する情報は送信しない。


files エレメント

持ちうるアトリビュート
  • type(必須)
  • subtype(type="Result" のときのみ必須。対応するfileのtypeを持つ。)
持ちうるエレメント
  • file(type="Result" result="Falure"の場合以外必須 常に1以上の数存在する。)

filesエレメントによる操作が成功した場合は
<files type="Result" result="Success" subtype="SUBTYPE" >
...
</files>
を、失敗した場合には
<files type="Result" result="Failure" subtype="SUBTYPE" desc="失敗原因" />
を返す。

files の交換によってはサーバー側/クライアント側の状態は変化しない。
files の受け入れ可能状態はサーバ/クライアント共にファイル選択待ち状態/ファイル選択済み状態のときのみである。

ファイル追加 type="Add"

このとき、filesエレメントは追加するファイルのファイル名を表すfileエレメントを持つ。
これをサーバがエラー無く受け入れた場合、追加されたファイルの一覧を返す。
サーバーは複数のファイルが指定され、一部について失敗した場合でもすべてのファイル追加を取り消し、Failureを返すこと。
ただし一つのfilenameしか許さない実装でよい。
例:
クライアント
<files type="Add">
<file name="FILEANAME0.EXTENTION"/>
<file name="FILEANAME1.EXTENTION"/>
</files>
サーバ
---成功時
<files type="Result" result="Success" subtype="Add" >
<file name="FILENAME0.EXTENTION">
<file name="FILENAME1.EXTENTION">
...
</file>
---失敗時
<files type="Result" result="Failure" subtype="Add" desc="失敗原因" />

ファイル削除 type="Delete"

このとき、filesエレメントは削除するファイルのファイル名を表すfileエレメントを持つ。
これをサーバがエラー無く受け入れた場合、削除されたファイルの一覧を返す。
サーバーは複数のファイルが指定され、一部について削除が失敗した場合でもすべてのファイル削除を取り消し、Failureを返すこと。
ただし一つのfilenameしか許さない実装でよい。
クライアント
<files type="Delete">
<file name="FILEANAME0.EXTENTION"/>
<file name="FILEANAME1.EXTENTION"/>
</files>
サーバー
---成功時
<files type="Result" result="Success" subtype="Delete" >
<file name="FILEANAME0.EXTENTION"/>
<file name="FILEANAME1.EXTENTION"/>
</files>
---失敗時
<files type="Result" result="Failure" subtype="Delete" desc="失敗原因" />

Notice エレメント

持ちうるアトリビュート
  • type(必須)
  • subtype(type="Result" のときのみ必須。対応するfileのtypeを持つ。)
持ちうるエレメント
  • Schs(type="Result" result="Falure"の場合以外必須 常に1つ存在する。)

Noticeは一方的な通知であり、相手の反応を必要としないためNoticeによる操作は成功しても失敗しても返信は帰らない
Notice の交換によってはサーバー側/クライアント側の状態は変化しない。
Notice の受け入れ可能状態 type="Disconnect"はサーバ/クライアント共に常に受信可能、それ以外ではクライアントのみ受け付け、ファイル選択済み状態のときのみである。

データ更新通知 type="Updated"

このとき、Noticeエレメントは更新を通知するschエレメント群を含むschsエレメントを持つ。
例:
サーバ
<notice type="Updated">
<schs filename="FILENAME.EXTENTION" baseage = "CAge" newage = SAge newid="NewSchsID" >
<sch uid= "*****" ...>...</sch>
...
</schs>
</notice>

ファイル削除通知 type="Deleted"

このとき、Noticeエレメントはfileエレメントを持つ。

例:
サーバ
<notice type="Deleted">
<file name="FILEANAME0.EXTENTION"/>
...
<notice/>

切断 type="Disconnect"

このとき、Noticeエレメントはエレメントを持たない。
これを受信したサーバまたはクライアントは即時に接続を切断する。

ただし一つのfilenameしか許さない実装でよい。
サーバ
<notice type="Disconnect" />

command エレメント

持ちうるアトリビュート
  • type(必須)
  • subtype(type="Result" のときのみ必須。対応するfileのtypeを持つ。)
持ちうるエレメント
  • 未定

commandは命令を扱う。

サーバ終了命令 type="Exit"

このときcommandはエレメントを持たない。
このコマンドが成功した場合、サーバーはその動作を終了する。
コマンドの成功/失敗にかかわらず返信は必要ない。
例:
クライアント
<command type="Exit" />

サーバ設定変更命令 type="Config"

このとき、commandエレメントはsettingエレメントを持つ。
サーバは設定変更の結果を返す。
設定変更に失敗した場合は、個々の項目について成功/失敗を返し、このコマンド自体の失敗はありえない。

例:
クライアント
<command type="Config">
<setting Key="SETTING_KEY_NAME" value="SETTING_VALUE" />
...
<command/>
サーバ
<command type="Result" result="Success" >
<setting relult="Success/Failure" Key="SETTING_KEY_NAME" value="SETTING_VALUE" />
...
<command/>

切断 type="Disconnect"

このとき、commandエレメントはエレメントを持たない。
これを受信したサーバまたはクライアントは即時に接続を切断する。

ただし一つのfilenameしか許さない実装でよい。
サーバ
<command type="Disconnect" />

error エレメント

持ちうるアトリビュート
  • num(必須)
  • type(必須)
  • desc(必須)
持ちうるエレメント
  • 未定

errorエレメントは
・各命令が解釈が不可能であった場合
・致命的な不具合が発生した場合場合
に送られる。
各コマンドが本来の処理をした上でその処理結果が失敗であった場合は、各コマンドに対してresultをFailureで返すことに注意。

例:


以下に例をあげる。

・XML書式エラー(タグが閉じてない、リテラル文字列が閉じてないなど)
<error num="1" type="Syntax Error" desc="Invalid xml format"/>

・トップレベルタグがない
<error num="2" type="Format Error" desc="No toplevel tag"/>

・エレメントに必須のアトリビュートがない
<error num="3" type="Format Error" desc="No ***** attribute in ***** tag"/>

・想定外のアトリビュート値が指定された
<error num="4" type="Format Error" desc="Invalid value ***** attribute in ***** tag"/>

・必須のエレメントが存在しない
<error num="5" type="Format Error" desc="No ***** tag in ***** tag."/>

・データ更新に失敗(ファイルIOエラー)
<error num="10" type="Server Error" desc="FileI/O Error"/>

トップレベル以外のエレメント

schs エレメント

schsエレメントは
  • filenameアトリビュート(必須)
  • baseageアトリビュート(必須) 0以上の整数値を取る。
  • newageアトリビュート(noticeのときのみ。必須。) 1以上の整数値を取る。
  • newidアトリビュート(notice,data.type=Modifyのときのみ。必須。) ユニークなIDを取る。
  • oldidアトリビュート(data.type=Modify/Verifyのときのみ。必須。) ユニークなIDを取る。
を持つ。
schsエレメントは0無いし1つ以上のschエレメントを持つ。

filename アトリビュート

filenamesアトリビュートは1文字以上のアルファベットとアンダースコアとピリオドの組みあわせの文字列をもつ。
大文字小文字は区別しない。

例:


<sch filename="FILENAME.EXTENTION" ... />

sch エレメント

schエレメントはuidアトリビュート(必須)と省略可能な多くのエレメント/アトリビュートを持つ。
アトリビュートの内、actionアトリビュートに"Notice"以外が指定された場合はaction,uid以外のアトリビュート/下位のエレメントは一切持たない。
actionアトリビュートのデフォルト値は"Notice"である。

uidアトリビュート

uidアトリビュートはアルファベットと数字からなる全世界単位でユニークな文字列である。
そのユニークさはクライアントで保証される。

actionアトリビュート

actionアトリビュートは以下の値をとりうる。
Notice
データの追加/変更/通知を行う。
この値はデフォルト値であり、一般に省略される。
Deleted
サーバからクライアントに贈られる。
特定のuidを持つデータが削除されたことを通知する。
Committed
サーバからクライアントに贈られる。
先立つdata.type="Modify"でクライアントから変更通知の来た特定のuidを持つデータがただしく変更できた事を通知する。
Aborted
サーバからクライアントに贈られる。
先立つdata.type="Modify"でクライアントから変更通知の来た特定のuidを持つデータが
・サーバからすでに削除されていた
・クライアントが検知していない間に変更されていた
・データファイルが削除されていた
等の理由で変更できなかった事を通知する。

その他のアトリビュート/要素

その他のアトリビュート/要素はクライアントによって定義され、変更される。
詳細は後日

クライアント

概要

クライアントは以下の動作を行う
  • クライアントは適宜サーバーに対してdata.type="Verify"セッションを送信する。
  • ユーザーから入力されたデータをXMLに変換し、data.type="Modify"セッションでサーバに送信する。
  • サーバからnotice.type="Updated"セッションが来た場合、クライアント内のローカルデータに情報を反映する。
  • サーバからnotice.type="Deleted"セッションが来た場合、クライアント内のローカルデータに情報を反映する。
  • サーバからdata.type="Result" .result="Success"セッションが来た場合、Abortについて表示し、アボートされた操作を取り消す。
  • (実際には先立つnotice.type="Updated"でアボートされたデータはすでに変更されてしまっているはず)
  • サーバからerrorセッションが来た場合、エラーを表示する。
  • サーバからnotice.type="Disconnect"セッションが来た場合、情報を表示する。
  • サーバからinformation.type="Result" .result="Success" .subtype="Filenames"セッションが来た場合、予期していればその情報を、予期しない場合であればエラーを表示する。

サーバ認証動作

クライアントはサーバーへの接続が完了した後、接続時にサーバから送られてきたcertificate.type="Preparation"セッションの情報に従い、サーバーに対してサーバ認証を行う。
サーバ認証に失敗した場合はユーザーにその旨を告げ、対応を待つ。

ファイル認証動作

クライアントはサーバー認証が完了した後、データファイルについての操作を行う前に接続時にサーバから送られてきたcertificateセッションの情報に従い、サーバーに対してファイル認証を行う。
ファイル認証に失敗した場合はユーザーにその旨を告げ、対応を待つ。

データ確認タイミング時の動作

クライアントはデータ確認のタイミング(起動時、所定の時間が過ぎた後等)でサーバーに最新のデータ送信を要求する。
このとき、data.type="Verify"のセッションが送信される
schs.baseageにはローカルに保存されている現在のAgeが使われる。
注意:このとき、クライアントは反応を待たない。

データ更新時の動作

クライアントはユーザーにより新しいデータが入力されたとき/既存のデータが変更されたとき、サーバーにその変更を通知する。
このとき、data.type="Modify"のセッションが送信される。 schs.baseageにはローカルに保存されている現在のAge+1が使われる。

データファイル確認時の動作

クライアントはユーザーによりサーバのアドレス/ポートが指定されたとき、該当サーバにて使用できるデータファイルを取得するためにサーバーにファイル名送信を要求する。
このとき、information.type="Filename"のセッションが送信される。

session.type="Filenames"受信時の動作

クライアントはサーバからFilenamesセッションによりファイル名群が与えられると、そのファイル名群をユーザーに提示して使用するファイルを選択させる。
もしこのときファイル名群受信待ち状態でなければエラーを発生させる。

切断時の動作

クライアントはソフトが終了するとき/データの参照が解除されたときにサーバに切断を通知し、切断する。
このとき、notice.type="Disconnect"のセッションが送信される。

session.type="Disconnect"受信時の動作

クライアントはサーバよりDisconnectセッションを受信した場合、
・ただちにTCP/IPセッションを切断し
・必要に応じてユーザにその旨を通知し
・バックアップを使用するモードに入る。

サーバー

ここでは

概要

サーバは以下の動作を行う。
  • クライアントより送られてきたdata.type="Verify"/"Modify"セッションにおいて、処理に先立ってCAgeよりサーバにCAge-1にて登録されたSchsIDを取得する。このSchsIDがクライアントより送られてきたschs.oldidと異なる場合にはnotice.type="Updated",schs.type="Disagreement Occurred" を発行する。(SchsID認証 失敗)。一致した場合(SchsID認証 成功)は以下の処理を行う。
  • Verifyセッションが来た場合、CAgeからSAgeまでの差分データをNoticeセッションにて送信する。場合によってはErrorセッションを送信する。
  • クライアントからModiifyセッションが来た場合、SAgeとCAgeに差があればCAgeからSAgeまでの差分データをNoticeセッションにて送信する。その後、送信されてきたデータを登録/またはアボートし、data.type="Result"セッションにて登録/アボート結果を通知する。場合によってはErrorセッションを送信する。
  • クライアントからinfomation.type="Filenames"セッションが来た場合、管理するデータファイル名を送信する。
  • クライアントからnotice.type="Disconnect"セッションが来た場合、返答することなく接続を切断する。
  • サーバーはサーバーレベル/ファイルレベルについてユーザー管理を行う。ファイルについては書き込み可/読み込み飲み可の権限管理も行う。
  • 実装レベルでは
    サーバーは初期値としてサーバー/各データファイルについて
    User:Anonymous
    Pass:Pass
    のユーザーが登録されているとする。
    command,filesセッションについてはIP認証をクリアしたものだけに認めることとする。

接続時の動作

サーバはクライアントよりの接続を検出した場合、認証のためにcertificiate.type="preparation"セッションを送信する。
このとき、サーバーが受け入れ可能な認証方法をtypeエレメントとして保持して返す。 typeエレメントの例:
<type type="IP" />
IPアドレス認証
<type type="Plain" />
プレーンテキスト認証
<type type="Challenge/Response/MD5" />
<challenge>CHALLENGE_STRING</challenge>
</type>
MD5ダイジェストによるチャレンジ/レスポンス認証
*注意 将来の実装例

data.type="Verify"時の動作

dataエレメントについての項を参照

data.type="Modify"時の動作

dataエレメントについての項を参照

information.type="Filename"時の動作

サーバはinformation.type="Filename"セッションを受信した場合、現在利用可能なデータファイル名を列挙し、fileエレメントを作成してクライアントに送信する。
informationエレメントについての項を参照

session.type="Disconnect"時の動作

サーバはDisconnectセッションを受信した場合、ただちにTCP/IPセッションを切断する。

サーバ終了時の動作

サーバは終了前に各クライアントに対してDisconnectセッションを送信する







文責:野中洋志