package org.qii.weiciyuan.support.lib.sinasso;
import android.app.Activity;
import android.content.*;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.Signature;
import android.os.IBinder;
import android.os.RemoteException;
import android.text.TextUtils;
import com.sina.sso.RemoteSSO;
import org.qii.weiciyuan.dao.URLHelper;
/**
* User: qii
* Date: 13-6-18
*/
public class SsoHandler {
private ServiceConnection conn = null;
private static final int DEFAULT_AUTH_ACTIVITY_CODE = 32973;
private static final String WEIBO_SIGNATURE = "30820295308201fea00302010202044b4ef1bf300d"
+ "06092a864886f70d010105050030818d310b300906035504061302434e3110300e0603550408130"
+ "74265694a696e673110300e060355040713074265694a696e67312c302a060355040a132353696e"
+ "612e436f6d20546563686e6f6c6f677920284368696e612920436f2e204c7464312c302a0603550"
+ "40b132353696e612e436f6d20546563686e6f6c6f677920284368696e612920436f2e204c746430"
+ "20170d3130303131343130323831355a180f32303630303130323130323831355a30818d310b300"
+ "906035504061302434e3110300e060355040813074265694a696e673110300e0603550407130742"
+ "65694a696e67312c302a060355040a132353696e612e436f6d20546563686e6f6c6f67792028436"
+ "8696e612920436f2e204c7464312c302a060355040b132353696e612e436f6d20546563686e6f6c"
+ "6f677920284368696e612920436f2e204c746430819f300d06092a864886f70d010101050003818"
+ "d00308189028181009d367115bc206c86c237bb56c8e9033111889b5691f051b28d1aa8e42b66b7"
+ "413657635b44786ea7e85d451a12a82a331fced99c48717922170b7fc9bc1040753c0d38b4cf2b2"
+ "2094b1df7c55705b0989441e75913a1a8bd2bc591aa729a1013c277c01c98cbec7da5ad7778b2fa"
+ "d62b85ac29ca28ced588638c98d6b7df5a130203010001300d06092a864886f70d0101050500038"
+ "181000ad4b4c4dec800bd8fd2991adfd70676fce8ba9692ae50475f60ec468d1b758a665e961a3a"
+ "edbece9fd4d7ce9295cd83f5f19dc441a065689d9820faedbb7c4a4c4635f5ba1293f6da4b72ed3"
+ "2fb8795f736a20c95cda776402099054fccefb4a1a558664ab8d637288feceba9508aa907fc1fe2"
+ "b1ae5a0dec954ed831c0bea4";
private int mAuthActivityCode;
private static String ssoPackageName = "";// "com.sina.weibo";
private static String ssoActivityName = "";// "com.sina.weibo.MainTabActivity";
private Activity mAuthActivity;
private String[] authPermissions = {"friendships_groups_read", "friendships_groups_write"};
public SsoHandler(Activity activity) {
mAuthActivity = activity;
conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
RemoteSSO remoteSSOservice = RemoteSSO.Stub
.asInterface(service);
try {
ssoPackageName = remoteSSOservice.getPackageName();
ssoActivityName = remoteSSOservice.getActivityName();
boolean singleSignOnStarted = startSingleSignOn(
mAuthActivity, authPermissions,
mAuthActivityCode);
} catch (RemoteException e) {
e.printStackTrace();
}
}
};
}
public void authorize() {
authorize(DEFAULT_AUTH_ACTIVITY_CODE);
}
private void authorize(
int activityCode) {
mAuthActivityCode = activityCode;
boolean bindSucced = false;
// Prefer single sign-on, where available.
bindSucced = bindRemoteSSOService(mAuthActivity);
}
private boolean bindRemoteSSOService(Activity activity) {
Context context = activity.getApplicationContext();
Intent intent = new Intent("com.sina.weibo.remotessoservice");
return context.bindService(intent, conn, Context.BIND_AUTO_CREATE);
}
private boolean startSingleSignOn(Activity activity, String[] permissions, int activityCode) {
boolean didSucceed = true;
Intent intent = new Intent();
intent.setClassName(ssoPackageName, ssoActivityName);
intent.putExtra("appKey", URLHelper.APP_KEY);
intent.putExtra("redirectUri", URLHelper.DIRECT_URL);
if (permissions.length > 0) {
intent.putExtra("scope", TextUtils.join(",", permissions));
}
// validate Signature
if (!validateAppSignatureForIntent(activity, intent)) {
return false;
}
try {
activity.startActivityForResult(intent, activityCode);
} catch (ActivityNotFoundException e) {
didSucceed = false;
}
activity.getApplication().unbindService(conn);
return didSucceed;
}
private boolean validateAppSignatureForIntent(Activity activity,
Intent intent) {
ResolveInfo resolveInfo = activity.getPackageManager().resolveActivity(
intent, 0);
if (resolveInfo == null) {
return false;
}
String packageName = resolveInfo.activityInfo.packageName;
try {
PackageInfo packageInfo = activity.getPackageManager()
.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
for (Signature signature : packageInfo.signatures) {
if (WEIBO_SIGNATURE.equals(signature.toCharsString())) {
return true;
}
}
} catch (PackageManager.NameNotFoundException e) {
return false;
}
return false;
}
}