IMAPSでは、クライアント内にデータをセキュアに保存するための仕組みとして、SLSを提供しています。SLSを認証モードで利用している場合、格納データはパスワードをキーにして保護されています。
そのためパスワードが変更された場合、格納された暗号化データを引き継ぐ(暗号化データを新しいパスワードで再暗号化する)必要があります。
@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) {
// そのほかの例外については開発者用マニュアルを参照してください。
}
}
}
// ダイアログで、データの引き継ぎをおこなうかをユーザーに問い合わせる場合
// データを引き継ぎます
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 (例外キャッチ) {
// 例外については開発者用マニュアルを参照してください。
}
}
});
// ダイアログで、旧パスワードをユーザーに問い合わせてデータを引き継ぐ場合
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 (例外キャッチ) {
// そのほかの例外については開発者用マニュアルを参照してください。
}
}
});
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) {
// それぞれのエラーの実装.
}
}
}
private async void loginFunc() {
string url = "https://サーバアドレス:ポート";
string userId = "user1";
string passwd = "pass11";
try
{
LoginManager lm = new LoginManager();
await lm.loginOnline(url, userId, passwd);
}
catch (IMAPSSlsPasswordException spe)
{
// パスワードが異なるため、データの引き継ぎができなかった場合に例外が発生します。
// データの引き継ぎをおこなうかをユーザーに問い合わせます。
}
catch (例外キャッチ)
{
// キャッチした例外の内容に応じて、例外処理を実装します。
}
}
// データを引き継ぎます
private void transFunc(string oldPasswd) {
try
{
LoginManager lm = new LoginManager();
lm.transData(oldPasswd);
}
catch (IMAPSSlsPasswordException spe)
{
// パスワードが異なるため、データの引き継ぎができなかった場合に例外が発生します。
// データの引き継ぎをおこなうかをユーザーに問い合わせます。
}
catch (例外キャッチ)
{
// キャッチした例外の内容に応じて、例外処理を実装します。
}
}
// データを削除します
private void deleteFunc() {
try
{
LoginManager lm = new LoginManager();
lm.deleteData();
}
catch (例外キャッチ)
{
// キャッチした例外の内容に応じて、例外処理を実装します。
}
}