IMAPSでは、クライアント内にデータをセキュアに保存するための仕組みとして、SLSを提供しています。SLSを認証モードで利用している場合、格納データはパスワードをキーにして保護されています。
そのためパスワードが変更された場合、格納された暗号化データを引き継ぐ(暗号化データを新しいパスワードで再暗号化する)必要があります。
使用例:Android AsyncLoginTaskをオーバーライドしたクラスの処理です。
@Override
protected Boolean doInBackground(String... params) {
boolean result = true;
try {
// オンラインでのログイン
mLoginManager.loginOnline(mLoginURL, mUserId, mPasswd);
} catch (Exception e) {
exception = e;
result = false;
}
return result;
}
@Override
protected void onPostExecute(Boolean result) {
if (!result) {
if (exception instanceof IMAPSSlsPasswordException) {
// パスワードが異なるため、データの引き継ぎが出来なかった場合に例外が発生します。
// データの引き継ぎをおこなうかをユーザーに問い合わせます。
} else if (exception instanceof xxxxException) {
// その他の例外についてはJavadocを参照してください。
}
}
}
// ダイアログで、データの引き継ぎをおこなうかをユーザーに問い合わせる場合
// データを引き継ぎます
alertDialog.setPositiveButton("引き継ぎ",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// データを引き継ぐ場合は、旧パスワードをユーザーに問い合わせます。
}
});
// データを削除します
alertDialog.setNeutralButton("削除",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
LoginManager loginManager = new LoginManager(getApplicationContext());
try {
// データを削除する場合は、deleteDataを呼び出します。
loginManager.deleteData();
} catch (例外キャッチ) {
// 例外についてはJavadocを参照してください。
}
}
});
// ダイアログで、旧パスワードをユーザーに問い合わせてデータを引き継ぐ場合
alertDialog.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
EditText editText = (EditText) inputView.findViewById(R.id.old_password_inputtext);
String oldPassword = editText.getText().toString();
try {
// 入力された旧パスワードを引数に、transDataを呼び出します。
LoginManager loginManager = new LoginManager(getApplicationContext());
loginManager.transData(oldPassword);
} catch (IMAPSSlsPasswordException e) {
// 旧パスワードが異なるため、データの引き継ぎが出来なかった場合に例外が発生します。
} catch (例外キャッチ) {
// その他の例外についてはJavadocを参照してください。
}
}
});
[使用例:iOS]
IMALoginManager *loginManager;
- (void)func1
{
loginManager = [[IMALoginManager alloc] init:self];
[loginManager loginOnline:@"https:// サーバアドレス:ポート/"userId:@"userid"
passwd:@"password"];
// この後、ログイン結果は、IMALoginDelegateプロトコルのdidLoginFinishedメソッドで通知されます。
// IMALoginManagerのinitで自分自身をdelegateとして指定しています。
// 詳細はIMALoginManagerクラスを参照して下さい。
}
- (void) didLoginFinished:(NSError *)anError
{
NSString *message = nil;
if(anError == nil) {
message = @"LOGIN DONE";
} else {
if([anError.domain isEqualToString:IMAAuthErrorDomain]) {
switch (anError.code) {
case AuthLoginFailed:
message = @"LOGIN FAILED";
break;
case AuthAlreadyLogin:
message = @"ALREADY LOGIN";
break;
// それぞれのエラーの実装.
default:
message = @"SYSTEM ERROR";
break;
}
} else if([anError.domain isEqualToString:IMASlsErrorDomain]) {
switch (anError.code) {
case SlsOfflinePasswordError:
message = @"OFFLINE LOGIN FAILED";
break;
case SlsPasswordError:
{
message = @"NEED TAKES OVER";
// SLSデータの引き継ぎが必要.
// データを引き継ぐ場合は、旧パスワードを使用してtransDataを呼び出します.
// データを削除する場合は、deleteDataを呼び出します.
break;
}
// それぞれのエラーの実装.
default:
message = @"SYSTEM ERROR";
break;
}
} else {
message = @"SYSTEM ERROR";
}
NSLog(message);
}
}
// ダイアログで、データ引き継ぎをおこなうかをユーザーに問い合わせる場合
- (void)func2
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"title"
message:@"データ引き継ぎか削除かの問い合わせ"
delegate:self
cancelButtonTitle:nil
otherButtonTitles: @"削除", @"引き継ぎ", nil];
[alert show];
}
// ダイアログでデータ引き継ぎか削除が選択された時の処理の切り分けを行う
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
NSError *anError = nil;
BOOL result = NO;
if (buttonIndex == 0) {
// 削除が選択された場合は、deleteDataを呼び出します。
result = [loginManager deleteData:&anError];
if (!result) {
// それぞれのエラーの実装.
}
} else if (buttonIndex == 1) {
// データ引き継ぎが選択された場合は、入力された旧パスワードを引数に、transDataを呼び出します。
// UITextFieldから旧パスワードを取得
NSString *oldPassword = _oldPassword.text;
result = [loginManager transData:oldPassword error:&anError];
if(!result) {
// それぞれのエラーの実装.
}
}
}