导航菜单

页面标题

页面副标题

xDrip+ v04633772025.07.16 - AuthorizationManagementActivity.java 源代码

正在查看: xDrip+ v04633772025.07.16 应用的 AuthorizationManagementActivity.java JAVA 源代码文件

本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。


package net.openid.appauth;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import net.openid.appauth.AuthorizationException;
import net.openid.appauth.internal.Logger;
import org.json.JSONException;

public class AuthorizationManagementActivity extends Activity {
    private Intent mAuthIntent;
    private AuthorizationManagementRequest mAuthRequest;
    private boolean mAuthorizationStarted = false;
    private PendingIntent mCancelIntent;
    private PendingIntent mCompleteIntent;

    public static Intent createStartIntent(Context context, AuthorizationManagementRequest request, Intent authIntent, PendingIntent completeIntent, PendingIntent cancelIntent) {
        Intent createBaseIntent = createBaseIntent(context);
        createBaseIntent.putExtra("authIntent", authIntent);
        createBaseIntent.putExtra("authRequest", request.jsonSerializeString());
        createBaseIntent.putExtra("authRequestType", AuthorizationManagementUtil.requestTypeFor(request));
        createBaseIntent.putExtra("completeIntent", completeIntent);
        createBaseIntent.putExtra("cancelIntent", cancelIntent);
        return createBaseIntent;
    }

    public static Intent createResponseHandlingIntent(Context context, Uri responseUri) {
        Intent createBaseIntent = createBaseIntent(context);
        createBaseIntent.setData(responseUri);
        createBaseIntent.addFlags(603979776);
        return createBaseIntent;
    }

    private static Intent createBaseIntent(Context context) {
        return new Intent(context, (Class<?>) AuthorizationManagementActivity.class);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState == null) {
            extractState(getIntent().getExtras());
        } else {
            extractState(savedInstanceState);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (!this.mAuthorizationStarted) {
            try {
                startActivity(this.mAuthIntent);
                this.mAuthorizationStarted = true;
                return;
            } catch (ActivityNotFoundException unused) {
                handleBrowserNotFound();
                finish();
                return;
            }
        }
        if (getIntent().getData() != null) {
            handleAuthorizationComplete();
        } else {
            handleAuthorizationCanceled();
        }
        finish();
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean("authStarted", this.mAuthorizationStarted);
        outState.putParcelable("authIntent", this.mAuthIntent);
        outState.putString("authRequest", this.mAuthRequest.jsonSerializeString());
        outState.putString("authRequestType", AuthorizationManagementUtil.requestTypeFor(this.mAuthRequest));
        outState.putParcelable("completeIntent", this.mCompleteIntent);
        outState.putParcelable("cancelIntent", this.mCancelIntent);
    }

    private void handleAuthorizationComplete() {
        Uri data = getIntent().getData();
        Intent extractResponseData = extractResponseData(data);
        if (extractResponseData == null) {
            Logger.error("Failed to extract OAuth2 response from redirect", new Object[0]);
        } else {
            extractResponseData.setData(data);
            sendResult(this.mCompleteIntent, extractResponseData, -1);
        }
    }

    private void handleAuthorizationCanceled() {
        Logger.debug("Authorization flow canceled by user", new Object[0]);
        sendResult(this.mCancelIntent, AuthorizationException.fromTemplate(AuthorizationException.GeneralErrors.USER_CANCELED_AUTH_FLOW, null).toIntent(), 0);
    }

    private void handleBrowserNotFound() {
        Logger.debug("Authorization flow canceled due to missing browser", new Object[0]);
        sendResult(this.mCancelIntent, AuthorizationException.fromTemplate(AuthorizationException.GeneralErrors.PROGRAM_CANCELED_AUTH_FLOW, null).toIntent(), 0);
    }

    private void extractState(Bundle state) {
        if (state == null) {
            Logger.warn("No stored state - unable to handle response", new Object[0]);
            finish();
            return;
        }
        this.mAuthIntent = (Intent) state.getParcelable("authIntent");
        this.mAuthorizationStarted = state.getBoolean("authStarted", false);
        this.mCompleteIntent = (PendingIntent) state.getParcelable("completeIntent");
        this.mCancelIntent = (PendingIntent) state.getParcelable("cancelIntent");
        try {
            String string = state.getString("authRequest", null);
            this.mAuthRequest = string != null ? AuthorizationManagementUtil.requestFrom(string, state.getString("authRequestType", null)) : null;
        } catch (JSONException unused) {
            sendResult(this.mCancelIntent, AuthorizationException.AuthorizationRequestErrors.INVALID_REQUEST.toIntent(), 0);
        }
    }

    private void sendResult(PendingIntent callback, Intent cancelData, int resultCode) {
        if (callback != null) {
            try {
                callback.send(this, 0, cancelData);
                return;
            } catch (PendingIntent.CanceledException e) {
                Logger.error("Failed to send cancel intent", e);
                return;
            }
        }
        setResult(resultCode, cancelData);
    }

    private Intent extractResponseData(Uri responseUri) {
        if (responseUri.getQueryParameterNames().contains("error")) {
            return AuthorizationException.fromOAuthRedirect(responseUri).toIntent();
        }
        AuthorizationManagementResponse responseWith = AuthorizationManagementUtil.responseWith(this.mAuthRequest, responseUri);
        if ((this.mAuthRequest.getState() == null && responseWith.getState() != null) || (this.mAuthRequest.getState() != null && !this.mAuthRequest.getState().equals(responseWith.getState()))) {
            Logger.warn("State returned in authorization response (%s) does not match state from request (%s) - discarding response", responseWith.getState(), this.mAuthRequest.getState());
            return AuthorizationException.AuthorizationRequestErrors.STATE_MISMATCH.toIntent();
        }
        return responseWith.toIntent();
    }
}