/* AuthorizationProfile.java Copyright (c) 2014 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.manager.profile; import android.content.Intent; import org.deviceconnect.android.manager.DConnectMessageService; import org.deviceconnect.android.manager.DConnectSettings; import org.deviceconnect.android.manager.request.CreateClientRequest; import org.deviceconnect.android.manager.request.DConnectRequest; import org.deviceconnect.android.manager.request.GetAccessTokenRequest; import org.deviceconnect.android.message.MessageUtils; import org.deviceconnect.android.profile.DConnectProfile; import org.deviceconnect.android.profile.api.DConnectApi; import org.deviceconnect.android.profile.api.GetApi; import org.deviceconnect.profile.AuthorizationProfileConstants; /** * Authorization プロファイル. * * <p> * Local OAuthの認可機能を提供するAPI.<br/> * Local OAuthの認可機能を提供するデバイスプラグインは当クラスを継承し、対応APIを実装すること。 * </p> * @author NTT DOCOMO, INC. */ public class AuthorizationProfile extends DConnectProfile implements AuthorizationProfileConstants { public AuthorizationProfile() { addApi(mGetCreateClient); addApi(mGetRequestAccessToken); } @Override public String getProfileName() { return PROFILE_NAME; } /** * Local OAuthで使用するクライアントを作成要求を行う. */ private final DConnectApi mGetCreateClient = new GetApi() { @Override public String getAttribute() { return ATTRIBUTE_GRANT; } @Override public boolean onRequest(final Intent request, final Intent response) { // Local OAuthを使用しない場合にはNot Supportを返却する DConnectSettings settings = DConnectSettings.getInstance(); if (!settings.isUseALocalOAuth()) { MessageUtils.setNotSupportProfileError(response); return true; } DConnectRequest req = new CreateClientRequest(); req.setContext(getContext()); req.setRequest(request); req.setResponse(response); ((DConnectMessageService) getContext()).addRequest(req); return false; } }; /** * Local OAuthで使用するクライアントを作成要求を行う. */ private final DConnectApi mGetRequestAccessToken = new GetApi() { @Override public String getAttribute() { return ATTRIBUTE_ACCESS_TOKEN; } @Override public boolean onRequest(final Intent request, final Intent response) { // Local OAuthを使用しない場合にはNot Supportを返却する DConnectSettings settings = DConnectSettings.getInstance(); if (!settings.isUseALocalOAuth()) { MessageUtils.setNotSupportProfileError(response); return true; } DConnectRequest req = new GetAccessTokenRequest(); req.setContext(getContext()); req.setRequest(request); req.setResponse(response); ((DConnectMessageService) getContext()).addRequest(req); return false; } }; /** * 不正なオリジンをもつアプリケーションからリクエストを受信した場合のハンドラー. * <p> * 本クラスの外部でオリジンの正当性をチェックすること. * 不正な場合は本メソッドを呼び出した後、レスポンスを送信すること. * </p> * @param request リクエスト * @param response レスポンス */ public void onInvalidOrigin(final Intent request, final Intent response) { String attribute = getAttribute(request); if (ATTRIBUTE_GRANT.equalsIgnoreCase(attribute)) { // GotAPI対応: エラーの場合は、空文字のクライアントIDを返す response.putExtra(AuthorizationProfile.PARAM_CLIENT_ID, ""); } else if (ATTRIBUTE_ACCESS_TOKEN.equalsIgnoreCase(attribute)) { // GotAPI対応: エラーの場合は、空文字のアクセストークンIDを返す response.putExtra(AuthorizationProfile.PARAM_ACCESS_TOKEN, ""); } } }