/* * Firetweet - Twitter client for Android * * Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.getlantern.firetweet.util; import android.content.Context; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.os.Binder; import android.os.Process; import android.text.TextUtils; import org.getlantern.firetweet.Constants; import java.util.HashMap; import java.util.Map; import static android.text.TextUtils.isEmpty; public class PermissionsManager implements Constants { private static final String[] PERMISSIONS_DENIED = { PERMISSION_DENIED }; private final SharedPreferencesWrapper mPreferences; private final PackageManager mPackageManager; private final Context mContext; public PermissionsManager(final Context context) { mContext = context; mPreferences = SharedPreferencesWrapper.getInstance(context, PERMISSION_PREFERENCES_NAME, Context.MODE_PRIVATE); mPackageManager = context.getPackageManager(); } public boolean accept(final String package_name, final String[] permissions) { if (package_name == null || permissions == null) return false; final SharedPreferences.Editor editor = mPreferences.edit(); editor.putString(package_name, FiretweetArrayUtils.toString(permissions, '|', false)); return editor.commit(); } public boolean checkCallingPermission(final String... requiredPermissions) { return checkPermission(Binder.getCallingUid(), requiredPermissions); } public boolean checkPermission(final int uid, final String... requiredPermissions) { if (requiredPermissions == null || requiredPermissions.length == 0) return true; if (Process.myUid() == uid) return true; if (checkSignature(uid)) return true; final String pname = getPackageNameByUid(uid); final String[] permissions = getPermissions(pname); return FiretweetArrayUtils.contains(permissions, requiredPermissions); } public boolean checkPermission(final String pname, final String... requiredPermissions) { if (requiredPermissions == null || requiredPermissions.length == 0) return true; if (mContext.getPackageName().equals(pname)) return true; if (checkSignature(pname)) return true; final String[] permissions = getPermissions(pname); return FiretweetArrayUtils.contains(permissions, requiredPermissions); } public boolean checkSignature(final int uid) { final String pname = getPackageNameByUid(uid); return checkSignature(pname); } public boolean checkSignature(final String pname) { if (mContext.getPackageName().equals(pname)) return true; if (Utils.isDebugBuild()) return false; return mPackageManager.checkSignatures(pname, mContext.getPackageName()) == PackageManager.SIGNATURE_MATCH; } public boolean deny(final String package_name) { if (package_name == null) return false; final SharedPreferences.Editor editor = mPreferences.edit(); editor.putString(package_name, PERMISSION_DENIED); return editor.commit(); } public Map<String, String> getAll() { final Map<String, String> map = new HashMap<String, String>(); for (final Map.Entry<String, ?> entry : mPreferences.getAll().entrySet()) { if (entry.getValue() instanceof String) { map.put(entry.getKey(), (String) entry.getValue()); } } return map; } public String getPackageNameByUid(final int uid) { final String[] pkgs = mPackageManager.getPackagesForUid(uid); if (pkgs != null && pkgs.length > 0) return pkgs[0]; return null; } public String[] getPermissions(final int uid) { return getPermissions(getPackageNameByUid(uid)); } public String[] getPermissions(final String packageName) { if (isEmpty(packageName)) return new String[0]; final String permissionsString = mPreferences.getString(packageName, null); if (isEmpty(permissionsString)) return new String[0]; if (permissionsString.contains(PERMISSION_DENIED)) return PERMISSIONS_DENIED; return permissionsString.split("\\|"); } public boolean revoke(final String packageName) { if (packageName == null) return false; final SharedPreferences.Editor editor = mPreferences.edit(); editor.remove(packageName); return editor.commit(); } public static boolean hasPermissions(final String[] permissions, final String... requiredPermissions) { return FiretweetArrayUtils.contains(permissions, requiredPermissions); } public static boolean isPermissionValid(final String permissionsString) { return TextUtils.isEmpty(permissionsString); } public static boolean isPermissionValid(final String... permissions) { return permissions != null && permissions.length != 0; } public static String[] parsePermissions(final String permissionsString) { if (isEmpty(permissionsString)) return new String[0]; return permissionsString.split(SEPARATOR_PERMISSION_REGEX); } }