// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.externalauth;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
import android.text.TextUtils;
import java.util.HashMap;
import java.util.Map;
/**
* Handler class that ignores any messages coming from external caller that doesn't meet the given
* authentication requirements.
*/
public class VerifiedHandler extends Handler {
private final int mAuthRequirements;
private final String mCallerPackageToMatch;
private final Map<Messenger, Boolean> mClientTrustMap = new HashMap<Messenger, Boolean>();
private final Context mContext;
/**
* Basic constructor for verified handler.
* @param context The context to use for accessing the package manager.
* @param authRequirements The requirements for authenticating the caller application.
*/
public VerifiedHandler(Context context, int authRequirements) {
this(context, authRequirements, "");
}
/**
* Constructor with package name requirement.
* @param context The context to use for accessing the package manager.
* @param authRequirements The requirements for authenticating the caller application.
* @param callerPackageToMatch The package name to match to.
*/
public VerifiedHandler(Context context, int authRequirements,
String callerPackageToMatch) {
mContext = context;
mAuthRequirements = authRequirements;
mCallerPackageToMatch = callerPackageToMatch;
}
@Override
public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
Messenger client = msg.replyTo;
if (!mClientTrustMap.containsKey(client)) mClientTrustMap.put(client, checkCallerIsValid());
if (!mClientTrustMap.get(client)) return false;
return super.sendMessageAtTime(msg, uptimeMillis);
}
/**
* @return Whether the calling application is valid given the requirements
* set during construction.
*/
public boolean checkCallerIsValid() {
if (TextUtils.isEmpty(mCallerPackageToMatch)) {
return ExternalAuthUtils.getInstance().isCallerValid(mContext, mAuthRequirements);
} else {
return ExternalAuthUtils.getInstance().isCallerValidForPackage(
mContext, mAuthRequirements, mCallerPackageToMatch);
}
}
}