Extend provider for new api tables
This commit is contained in:
@@ -63,7 +63,7 @@ public class KeychainContract {
|
|||||||
String ENCRYPTION_ALGORITHM = "encryption_algorithm";
|
String ENCRYPTION_ALGORITHM = "encryption_algorithm";
|
||||||
String HASH_ALORITHM = "hash_algorithm";
|
String HASH_ALORITHM = "hash_algorithm";
|
||||||
String COMPRESSION = "compression";
|
String COMPRESSION = "compression";
|
||||||
String PACKAGE_NAME = "package_name"; // foreign key to api_apps.package_name
|
String PACKAGE_NAME_FK = "package_name"; // foreign key to api_apps.package_name
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final class KeyTypes {
|
public static final class KeyTypes {
|
||||||
@@ -90,7 +90,10 @@ public class KeychainContract {
|
|||||||
public static final String PATH_USER_IDS = "user_ids";
|
public static final String PATH_USER_IDS = "user_ids";
|
||||||
public static final String PATH_KEYS = "keys";
|
public static final String PATH_KEYS = "keys";
|
||||||
|
|
||||||
public static final String BASE_API_APPS = "api_apps";
|
public static final String BASE_API = "api";
|
||||||
|
public static final String PATH_APPS = "apps";
|
||||||
|
public static final String PATH_ACCOUNTS = "accounts";
|
||||||
|
|
||||||
public static final String PATH_BY_PACKAGE_NAME = "package_name";
|
public static final String PATH_BY_PACKAGE_NAME = "package_name";
|
||||||
|
|
||||||
public static class KeyRings implements KeyRingsColumns, BaseColumns {
|
public static class KeyRings implements KeyRingsColumns, BaseColumns {
|
||||||
@@ -254,19 +257,70 @@ public class KeychainContract {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ApiApps implements ApiAppsColumns, BaseColumns {
|
/**
|
||||||
|
* Join over ApiApps with ApiAppsAccounts
|
||||||
|
*/
|
||||||
|
public static class Api implements ApiAppsColumns, ApiAppsAccountsColumns, BaseColumns {
|
||||||
public static final Uri CONTENT_URI = BASE_CONTENT_URI_INTERNAL.buildUpon()
|
public static final Uri CONTENT_URI = BASE_CONTENT_URI_INTERNAL.buildUpon()
|
||||||
.appendPath(BASE_API_APPS).build();
|
.appendPath(BASE_API).build();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Use if multiple items get returned
|
* Use if multiple items get returned
|
||||||
*/
|
*/
|
||||||
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.thialfihar.apg.api_apps";
|
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.thialfihar.apg.apis";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Use if a single item is returned
|
* Use if a single item is returned
|
||||||
*/
|
*/
|
||||||
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.thialfihar.apg.api_apps";
|
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.thialfihar.apg.api";
|
||||||
|
|
||||||
|
public static Uri buildIdUri(String rowId) {
|
||||||
|
return CONTENT_URI.buildUpon().appendPath(rowId).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Uri buildByPackageNameUri(String packageName) {
|
||||||
|
return CONTENT_URI.buildUpon().appendPath(PATH_BY_PACKAGE_NAME).appendPath(packageName)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ApiApps implements ApiAppsColumns, BaseColumns {
|
||||||
|
public static final Uri CONTENT_URI = BASE_CONTENT_URI_INTERNAL.buildUpon()
|
||||||
|
.appendPath(BASE_API).appendPath(PATH_APPS).build();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use if multiple items get returned
|
||||||
|
*/
|
||||||
|
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.thialfihar.apg.api.app";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use if a single item is returned
|
||||||
|
*/
|
||||||
|
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.thialfihar.apg.api.apps";
|
||||||
|
|
||||||
|
public static Uri buildIdUri(String rowId) {
|
||||||
|
return CONTENT_URI.buildUpon().appendPath(rowId).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Uri buildByPackageNameUri(String packageName) {
|
||||||
|
return CONTENT_URI.buildUpon().appendPath(PATH_BY_PACKAGE_NAME).appendPath(packageName)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ApiAccounts implements ApiAppsAccountsColumns, BaseColumns {
|
||||||
|
public static final Uri CONTENT_URI = BASE_CONTENT_URI_INTERNAL.buildUpon()
|
||||||
|
.appendPath(BASE_API).appendPath(PATH_ACCOUNTS).build();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use if multiple items get returned
|
||||||
|
*/
|
||||||
|
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.thialfihar.apg.api.acoounts";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use if a single item is returned
|
||||||
|
*/
|
||||||
|
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.thialfihar.apg.api.account";
|
||||||
|
|
||||||
public static Uri buildIdUri(String rowId) {
|
public static Uri buildIdUri(String rowId) {
|
||||||
return CONTENT_URI.buildUpon().appendPath(rowId).build();
|
return CONTENT_URI.buildUpon().appendPath(rowId).build();
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public class KeychainDatabase extends SQLiteOpenHelper {
|
|||||||
String KEYS = "keys";
|
String KEYS = "keys";
|
||||||
String USER_IDS = "user_ids";
|
String USER_IDS = "user_ids";
|
||||||
String API_APPS = "api_apps";
|
String API_APPS = "api_apps";
|
||||||
String API_APPS_ACCOUNTS = "api_apps_accounts";
|
String API_ACCOUNTS = "api_accounts";
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final String CREATE_KEY_RINGS = "CREATE TABLE IF NOT EXISTS " + Tables.KEY_RINGS
|
private static final String CREATE_KEY_RINGS = "CREATE TABLE IF NOT EXISTS " + Tables.KEY_RINGS
|
||||||
@@ -80,14 +80,14 @@ public class KeychainDatabase extends SQLiteOpenHelper {
|
|||||||
+ ApiAppsColumns.PACKAGE_NAME + " TEXT UNIQUE, "
|
+ ApiAppsColumns.PACKAGE_NAME + " TEXT UNIQUE, "
|
||||||
+ ApiAppsColumns.PACKAGE_SIGNATURE + " BLOB)";
|
+ ApiAppsColumns.PACKAGE_SIGNATURE + " BLOB)";
|
||||||
|
|
||||||
private static final String CREATE_API_APPS_ACCOUNTS = "CREATE TABLE IF NOT EXISTS " + Tables.API_APPS_ACCOUNTS
|
private static final String CREATE_API_APPS_ACCOUNTS = "CREATE TABLE IF NOT EXISTS " + Tables.API_ACCOUNTS
|
||||||
+ " (" + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
|
+ " (" + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
|
||||||
+ ApiAppsAccountsColumns.KEY_ID + " INT64, "
|
+ ApiAppsAccountsColumns.KEY_ID + " INT64, "
|
||||||
+ ApiAppsAccountsColumns.ENCRYPTION_ALGORITHM + " INTEGER, "
|
+ ApiAppsAccountsColumns.ENCRYPTION_ALGORITHM + " INTEGER, "
|
||||||
+ ApiAppsAccountsColumns.HASH_ALORITHM + " INTEGER, "
|
+ ApiAppsAccountsColumns.HASH_ALORITHM + " INTEGER, "
|
||||||
+ ApiAppsAccountsColumns.COMPRESSION + " INTEGER"
|
+ ApiAppsAccountsColumns.COMPRESSION + " INTEGER"
|
||||||
+ ApiAppsAccountsColumns.PACKAGE_NAME + " TEXT NOT NULL, FOREIGN KEY("
|
+ ApiAppsAccountsColumns.PACKAGE_NAME_FK + " TEXT NOT NULL, FOREIGN KEY("
|
||||||
+ ApiAppsAccountsColumns.PACKAGE_NAME + ") REFERENCES " + Tables.API_APPS + "("
|
+ ApiAppsAccountsColumns.PACKAGE_NAME_FK + ") REFERENCES " + Tables.API_APPS + "("
|
||||||
+ ApiAppsColumns.PACKAGE_NAME + ") ON DELETE CASCADE)";
|
+ ApiAppsColumns.PACKAGE_NAME + ") ON DELETE CASCADE)";
|
||||||
|
|
||||||
KeychainDatabase(Context context) {
|
KeychainDatabase(Context context) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2012-2013 Dominik Schürmann <dominik@dominikschuermann.de>
|
* Copyright (C) 2012-2014 Dominik Schürmann <dominik@dominikschuermann.de>
|
||||||
* Copyright (C) 2010 Thialfihar <thi@thialfihar.org>
|
* Copyright (C) 2010 Thialfihar <thi@thialfihar.org>
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -28,8 +28,19 @@ import android.database.sqlite.SQLiteQueryBuilder;
|
|||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.provider.BaseColumns;
|
import android.provider.BaseColumns;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
|
||||||
import org.sufficientlysecure.keychain.Constants;
|
import org.sufficientlysecure.keychain.Constants;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.*;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.Api;
|
||||||
|
import org.sufficientlysecure.keychain.provider.KeychainContract.ApiAccounts;
|
||||||
|
import org.sufficientlysecure.keychain.provider.KeychainContract.ApiApps;
|
||||||
|
import org.sufficientlysecure.keychain.provider.KeychainContract.ApiAppsAccountsColumns;
|
||||||
|
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
|
||||||
|
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRingsColumns;
|
||||||
|
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyTypes;
|
||||||
|
import org.sufficientlysecure.keychain.provider.KeychainContract.Keys;
|
||||||
|
import org.sufficientlysecure.keychain.provider.KeychainContract.KeysColumns;
|
||||||
|
import org.sufficientlysecure.keychain.provider.KeychainContract.UserIds;
|
||||||
|
import org.sufficientlysecure.keychain.provider.KeychainContract.UserIdsColumns;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainDatabase.Tables;
|
import org.sufficientlysecure.keychain.provider.KeychainDatabase.Tables;
|
||||||
import org.sufficientlysecure.keychain.util.Log;
|
import org.sufficientlysecure.keychain.util.Log;
|
||||||
|
|
||||||
@@ -70,9 +81,15 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
private static final int SECRET_KEY_RING_USER_ID = 221;
|
private static final int SECRET_KEY_RING_USER_ID = 221;
|
||||||
private static final int SECRET_KEY_RING_USER_ID_BY_ROW_ID = 222;
|
private static final int SECRET_KEY_RING_USER_ID_BY_ROW_ID = 222;
|
||||||
|
|
||||||
private static final int API_APPS = 301;
|
private static final int API = 301;
|
||||||
private static final int API_APPS_BY_ROW_ID = 302;
|
private static final int API_BY_ROW_ID = 302;
|
||||||
private static final int API_APPS_BY_PACKAGE_NAME = 303;
|
private static final int API_BY_PACKAGE_NAME = 303;
|
||||||
|
private static final int API_APPS = 304;
|
||||||
|
private static final int API_APPS_BY_ROW_ID = 305;
|
||||||
|
private static final int API_APPS_BY_PACKAGE_NAME = 306;
|
||||||
|
private static final int API_ACCOUNTS = 307;
|
||||||
|
private static final int API_ACCOUNTS_BY_ROW_ID = 308;
|
||||||
|
private static final int API_ACCOUNTS_BY_PACKAGE_NAME = 309;
|
||||||
|
|
||||||
private static final int UNIFIED_KEY_RING = 401;
|
private static final int UNIFIED_KEY_RING = 401;
|
||||||
|
|
||||||
@@ -230,11 +247,27 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
/**
|
/**
|
||||||
* API apps
|
* API apps
|
||||||
*/
|
*/
|
||||||
matcher.addURI(authority, KeychainContract.BASE_API_APPS, API_APPS);
|
matcher.addURI(authority, KeychainContract.BASE_API, API);
|
||||||
matcher.addURI(authority, KeychainContract.BASE_API_APPS + "/#", API_APPS_BY_ROW_ID);
|
matcher.addURI(authority, KeychainContract.BASE_API + "/#", API_BY_ROW_ID);
|
||||||
matcher.addURI(authority, KeychainContract.BASE_API_APPS + "/"
|
matcher.addURI(authority, KeychainContract.BASE_API + "/"
|
||||||
|
+ KeychainContract.PATH_BY_PACKAGE_NAME + "/*", API_BY_PACKAGE_NAME);
|
||||||
|
|
||||||
|
matcher.addURI(authority, KeychainContract.BASE_API + "/"
|
||||||
|
+ KeychainContract.PATH_APPS, API_APPS);
|
||||||
|
matcher.addURI(authority, KeychainContract.BASE_API + "/"
|
||||||
|
+ KeychainContract.PATH_APPS + "/#", API_APPS_BY_ROW_ID);
|
||||||
|
matcher.addURI(authority, KeychainContract.BASE_API + "/"
|
||||||
|
+ KeychainContract.PATH_APPS + "/"
|
||||||
+ KeychainContract.PATH_BY_PACKAGE_NAME + "/*", API_APPS_BY_PACKAGE_NAME);
|
+ KeychainContract.PATH_BY_PACKAGE_NAME + "/*", API_APPS_BY_PACKAGE_NAME);
|
||||||
|
|
||||||
|
matcher.addURI(authority, KeychainContract.BASE_API + "/"
|
||||||
|
+ KeychainContract.PATH_ACCOUNTS, API_ACCOUNTS);
|
||||||
|
matcher.addURI(authority, KeychainContract.BASE_API + "/"
|
||||||
|
+ KeychainContract.PATH_ACCOUNTS + "/#", API_ACCOUNTS_BY_ROW_ID);
|
||||||
|
matcher.addURI(authority, KeychainContract.BASE_API + "/"
|
||||||
|
+ KeychainContract.PATH_ACCOUNTS + "/"
|
||||||
|
+ KeychainContract.PATH_BY_PACKAGE_NAME + "/*", API_ACCOUNTS_BY_PACKAGE_NAME);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* data stream
|
* data stream
|
||||||
*
|
*
|
||||||
@@ -299,6 +332,13 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
case SECRET_KEY_RING_USER_ID_BY_ROW_ID:
|
case SECRET_KEY_RING_USER_ID_BY_ROW_ID:
|
||||||
return UserIds.CONTENT_ITEM_TYPE;
|
return UserIds.CONTENT_ITEM_TYPE;
|
||||||
|
|
||||||
|
case API:
|
||||||
|
return Api.CONTENT_TYPE;
|
||||||
|
|
||||||
|
case API_BY_ROW_ID:
|
||||||
|
case API_BY_PACKAGE_NAME:
|
||||||
|
return Api.CONTENT_ITEM_TYPE;
|
||||||
|
|
||||||
case API_APPS:
|
case API_APPS:
|
||||||
return ApiApps.CONTENT_TYPE;
|
return ApiApps.CONTENT_TYPE;
|
||||||
|
|
||||||
@@ -306,6 +346,13 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
case API_APPS_BY_PACKAGE_NAME:
|
case API_APPS_BY_PACKAGE_NAME:
|
||||||
return ApiApps.CONTENT_ITEM_TYPE;
|
return ApiApps.CONTENT_ITEM_TYPE;
|
||||||
|
|
||||||
|
case API_ACCOUNTS:
|
||||||
|
return ApiAccounts.CONTENT_TYPE;
|
||||||
|
|
||||||
|
case API_ACCOUNTS_BY_ROW_ID:
|
||||||
|
case API_ACCOUNTS_BY_PACKAGE_NAME:
|
||||||
|
return ApiAccounts.CONTENT_ITEM_TYPE;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new UnsupportedOperationException("Unknown uri: " + uri);
|
throw new UnsupportedOperationException("Unknown uri: " + uri);
|
||||||
}
|
}
|
||||||
@@ -506,7 +553,6 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PUBLIC_KEY_RING:
|
case PUBLIC_KEY_RING:
|
||||||
case SECRET_KEY_RING:
|
case SECRET_KEY_RING:
|
||||||
qb = buildKeyRingQuery(qb, match);
|
qb = buildKeyRingQuery(qb, match);
|
||||||
@@ -516,7 +562,6 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PUBLIC_KEY_RING_BY_ROW_ID:
|
case PUBLIC_KEY_RING_BY_ROW_ID:
|
||||||
case SECRET_KEY_RING_BY_ROW_ID:
|
case SECRET_KEY_RING_BY_ROW_ID:
|
||||||
qb = buildKeyRingQuery(qb, match);
|
qb = buildKeyRingQuery(qb, match);
|
||||||
@@ -529,7 +574,6 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PUBLIC_KEY_RING_BY_MASTER_KEY_ID:
|
case PUBLIC_KEY_RING_BY_MASTER_KEY_ID:
|
||||||
case SECRET_KEY_RING_BY_MASTER_KEY_ID:
|
case SECRET_KEY_RING_BY_MASTER_KEY_ID:
|
||||||
qb = buildKeyRingQuery(qb, match);
|
qb = buildKeyRingQuery(qb, match);
|
||||||
@@ -542,7 +586,6 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SECRET_KEY_RING_BY_KEY_ID:
|
case SECRET_KEY_RING_BY_KEY_ID:
|
||||||
case PUBLIC_KEY_RING_BY_KEY_ID:
|
case PUBLIC_KEY_RING_BY_KEY_ID:
|
||||||
qb = buildKeyRingQueryWithSpecificKey(qb, match);
|
qb = buildKeyRingQueryWithSpecificKey(qb, match);
|
||||||
@@ -555,7 +598,6 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SECRET_KEY_RING_BY_EMAILS:
|
case SECRET_KEY_RING_BY_EMAILS:
|
||||||
case PUBLIC_KEY_RING_BY_EMAILS:
|
case PUBLIC_KEY_RING_BY_EMAILS:
|
||||||
qb = buildKeyRingQuery(qb, match);
|
qb = buildKeyRingQuery(qb, match);
|
||||||
@@ -585,7 +627,6 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SECRET_KEY_RING_BY_LIKE_EMAIL:
|
case SECRET_KEY_RING_BY_LIKE_EMAIL:
|
||||||
case PUBLIC_KEY_RING_BY_LIKE_EMAIL:
|
case PUBLIC_KEY_RING_BY_LIKE_EMAIL:
|
||||||
qb = buildKeyRingQuery(qb, match);
|
qb = buildKeyRingQuery(qb, match);
|
||||||
@@ -601,7 +642,6 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
+ "))");
|
+ "))");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PUBLIC_KEY_RING_KEY:
|
case PUBLIC_KEY_RING_KEY:
|
||||||
case SECRET_KEY_RING_KEY:
|
case SECRET_KEY_RING_KEY:
|
||||||
qb.setTables(Tables.KEYS);
|
qb.setTables(Tables.KEYS);
|
||||||
@@ -614,7 +654,6 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
qb.setProjectionMap(getProjectionMapForKeys());
|
qb.setProjectionMap(getProjectionMapForKeys());
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PUBLIC_KEY_RING_KEY_BY_ROW_ID:
|
case PUBLIC_KEY_RING_KEY_BY_ROW_ID:
|
||||||
case SECRET_KEY_RING_KEY_BY_ROW_ID:
|
case SECRET_KEY_RING_KEY_BY_ROW_ID:
|
||||||
qb.setTables(Tables.KEYS);
|
qb.setTables(Tables.KEYS);
|
||||||
@@ -630,7 +669,6 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
qb.setProjectionMap(getProjectionMapForKeys());
|
qb.setProjectionMap(getProjectionMapForKeys());
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PUBLIC_KEY_RING_BY_MASTER_KEY_ID_USER_ID:
|
case PUBLIC_KEY_RING_BY_MASTER_KEY_ID_USER_ID:
|
||||||
qb.setTables(Tables.USER_IDS + " INNER JOIN " + Tables.KEY_RINGS + " ON " + "("
|
qb.setTables(Tables.USER_IDS + " INNER JOIN " + Tables.KEY_RINGS + " ON " + "("
|
||||||
+ Tables.KEY_RINGS + "." + BaseColumns._ID + " = " + Tables.USER_IDS + "."
|
+ Tables.KEY_RINGS + "." + BaseColumns._ID + " = " + Tables.USER_IDS + "."
|
||||||
@@ -641,7 +679,6 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
qb.setProjectionMap(getProjectionMapForUserIds());
|
qb.setProjectionMap(getProjectionMapForUserIds());
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PUBLIC_KEY_RING_USER_ID:
|
case PUBLIC_KEY_RING_USER_ID:
|
||||||
case SECRET_KEY_RING_USER_ID:
|
case SECRET_KEY_RING_USER_ID:
|
||||||
qb.setTables(Tables.USER_IDS);
|
qb.setTables(Tables.USER_IDS);
|
||||||
@@ -649,7 +686,6 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
qb.appendWhereEscapeString(uri.getPathSegments().get(2));
|
qb.appendWhereEscapeString(uri.getPathSegments().get(2));
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PUBLIC_KEY_RING_USER_ID_BY_ROW_ID:
|
case PUBLIC_KEY_RING_USER_ID_BY_ROW_ID:
|
||||||
case SECRET_KEY_RING_USER_ID_BY_ROW_ID:
|
case SECRET_KEY_RING_USER_ID_BY_ROW_ID:
|
||||||
qb.setTables(Tables.USER_IDS);
|
qb.setTables(Tables.USER_IDS);
|
||||||
@@ -660,7 +696,28 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
qb.appendWhereEscapeString(uri.getLastPathSegment());
|
qb.appendWhereEscapeString(uri.getLastPathSegment());
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
case API:
|
||||||
|
qb.setTables(Tables.API_ACCOUNTS + " INNER JOIN " + Tables.API_APPS + " ON " + "("
|
||||||
|
+ Tables.API_APPS + "." + ApiApps.PACKAGE_NAME + " = " + Tables.API_ACCOUNTS + "."
|
||||||
|
+ ApiAccounts.PACKAGE_NAME_FK + " )");
|
||||||
|
|
||||||
|
break;
|
||||||
|
case API_BY_ROW_ID:
|
||||||
|
qb.setTables(Tables.API_ACCOUNTS + " INNER JOIN " + Tables.API_APPS + " ON " + "("
|
||||||
|
+ Tables.API_APPS + "." + ApiApps.PACKAGE_NAME + " = " + Tables.API_ACCOUNTS + "."
|
||||||
|
+ ApiAccounts.PACKAGE_NAME_FK + " )");
|
||||||
|
qb.appendWhere(Tables.API_APPS + "." + BaseColumns._ID + " = ");
|
||||||
|
qb.appendWhereEscapeString(uri.getLastPathSegment());
|
||||||
|
|
||||||
|
break;
|
||||||
|
case API_BY_PACKAGE_NAME:
|
||||||
|
qb.setTables(Tables.API_ACCOUNTS + " INNER JOIN " + Tables.API_APPS + " ON " + "("
|
||||||
|
+ Tables.API_APPS + "." + ApiApps.PACKAGE_NAME + " = " + Tables.API_ACCOUNTS + "."
|
||||||
|
+ ApiAccounts.PACKAGE_NAME_FK + " )");
|
||||||
|
qb.appendWhere(Tables.API_APPS + "." + ApiApps.PACKAGE_NAME + " = ");
|
||||||
|
qb.appendWhereEscapeString(uri.getLastPathSegment());
|
||||||
|
|
||||||
|
break;
|
||||||
case API_APPS:
|
case API_APPS:
|
||||||
qb.setTables(Tables.API_APPS);
|
qb.setTables(Tables.API_APPS);
|
||||||
|
|
||||||
@@ -675,10 +732,26 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
case API_APPS_BY_PACKAGE_NAME:
|
case API_APPS_BY_PACKAGE_NAME:
|
||||||
qb.setTables(Tables.API_APPS);
|
qb.setTables(Tables.API_APPS);
|
||||||
qb.appendWhere(ApiApps.PACKAGE_NAME + " = ");
|
qb.appendWhere(ApiApps.PACKAGE_NAME + " = ");
|
||||||
qb.appendWhereEscapeString(uri.getPathSegments().get(2));
|
qb.appendWhereEscapeString(uri.getLastPathSegment());
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
case API_ACCOUNTS:
|
||||||
|
qb.setTables(Tables.API_ACCOUNTS);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case API_ACCOUNTS_BY_ROW_ID:
|
||||||
|
qb.setTables(Tables.API_ACCOUNTS);
|
||||||
|
|
||||||
|
qb.appendWhere(BaseColumns._ID + " = ");
|
||||||
|
qb.appendWhereEscapeString(uri.getLastPathSegment());
|
||||||
|
|
||||||
|
break;
|
||||||
|
case API_ACCOUNTS_BY_PACKAGE_NAME:
|
||||||
|
qb.setTables(Tables.API_ACCOUNTS);
|
||||||
|
qb.appendWhere(ApiAppsAccountsColumns.PACKAGE_NAME_FK + " = ");
|
||||||
|
qb.appendWhereEscapeString(uri.getLastPathSegment());
|
||||||
|
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
throw new IllegalArgumentException("Unknown URI " + uri);
|
throw new IllegalArgumentException("Unknown URI " + uri);
|
||||||
|
|
||||||
@@ -770,6 +843,11 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
rowId = db.insertOrThrow(Tables.API_APPS, null, values);
|
rowId = db.insertOrThrow(Tables.API_APPS, null, values);
|
||||||
rowUri = ApiApps.buildIdUri(Long.toString(rowId));
|
rowUri = ApiApps.buildIdUri(Long.toString(rowId));
|
||||||
|
|
||||||
|
break;
|
||||||
|
case API_ACCOUNTS:
|
||||||
|
rowId = db.insertOrThrow(Tables.API_ACCOUNTS, null, values);
|
||||||
|
rowUri = ApiAccounts.buildIdUri(Long.toString(rowId));
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new UnsupportedOperationException("Unknown uri: " + uri);
|
throw new UnsupportedOperationException("Unknown uri: " + uri);
|
||||||
@@ -836,6 +914,14 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
count = db.delete(Tables.API_APPS, buildDefaultApiAppsSelection(uri, true, selection),
|
count = db.delete(Tables.API_APPS, buildDefaultApiAppsSelection(uri, true, selection),
|
||||||
selectionArgs);
|
selectionArgs);
|
||||||
break;
|
break;
|
||||||
|
case API_ACCOUNTS_BY_ROW_ID:
|
||||||
|
count = db.delete(Tables.API_ACCOUNTS, buildDefaultApiAccountsSelection(uri, false, selection),
|
||||||
|
selectionArgs);
|
||||||
|
break;
|
||||||
|
case API_ACCOUNTS_BY_PACKAGE_NAME:
|
||||||
|
count = db.delete(Tables.API_ACCOUNTS, buildDefaultApiAccountsSelection(uri, true, selection),
|
||||||
|
selectionArgs);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
throw new UnsupportedOperationException("Unknown uri: " + uri);
|
throw new UnsupportedOperationException("Unknown uri: " + uri);
|
||||||
}
|
}
|
||||||
@@ -906,6 +992,14 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
count = db.update(Tables.API_APPS, values,
|
count = db.update(Tables.API_APPS, values,
|
||||||
buildDefaultApiAppsSelection(uri, true, selection), selectionArgs);
|
buildDefaultApiAppsSelection(uri, true, selection), selectionArgs);
|
||||||
break;
|
break;
|
||||||
|
case API_ACCOUNTS_BY_ROW_ID:
|
||||||
|
count = db.update(Tables.API_ACCOUNTS, values,
|
||||||
|
buildDefaultApiAccountsSelection(uri, false, selection), selectionArgs);
|
||||||
|
break;
|
||||||
|
case API_ACCOUNTS_BY_PACKAGE_NAME:
|
||||||
|
count = db.update(Tables.API_ACCOUNTS, values,
|
||||||
|
buildDefaultApiAccountsSelection(uri, true, selection), selectionArgs);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
throw new UnsupportedOperationException("Unknown uri: " + uri);
|
throw new UnsupportedOperationException("Unknown uri: " + uri);
|
||||||
}
|
}
|
||||||
@@ -1018,6 +1112,21 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String buildDefaultApiAccountsSelection(Uri uri, boolean packageSelection, String selection) {
|
||||||
|
String lastPathSegment = uri.getLastPathSegment();
|
||||||
|
|
||||||
|
String andSelection = "";
|
||||||
|
if (!TextUtils.isEmpty(selection)) {
|
||||||
|
andSelection = " AND (" + selection + ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (packageSelection) {
|
||||||
|
return ApiAccounts.PACKAGE_NAME_FK + "=" + lastPathSegment + andSelection;
|
||||||
|
} else {
|
||||||
|
return BaseColumns._ID + "=" + lastPathSegment + andSelection;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// @Override
|
// @Override
|
||||||
// public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
|
// public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
|
||||||
// int match = mUriMatcher.match(uri);
|
// int match = mUriMatcher.match(uri);
|
||||||
|
|||||||
@@ -809,44 +809,62 @@ public class ProviderHelper {
|
|||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void insertApiApp(Context context, AppSettings appSettings) {
|
private static ContentValues contentValueForApiAccounts(AppSettings appSettings) {
|
||||||
context.getContentResolver().insert(ApiApps.CONTENT_URI,
|
ContentValues values = new ContentValues();
|
||||||
|
values.put(KeychainContract.ApiAccounts.PACKAGE_NAME_FK, appSettings.getPackageName());
|
||||||
|
values.put(KeychainContract.ApiAccounts.KEY_ID, appSettings.getKeyId());
|
||||||
|
values.put(KeychainContract.ApiAccounts.COMPRESSION, appSettings.getCompression());
|
||||||
|
values.put(KeychainContract.ApiAccounts.ENCRYPTION_ALGORITHM, appSettings.getEncryptionAlgorithm());
|
||||||
|
values.put(KeychainContract.ApiAccounts.HASH_ALORITHM, appSettings.getHashAlgorithm());
|
||||||
|
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void insertApi(Context context, AppSettings appSettings) {
|
||||||
|
context.getContentResolver().insert(KeychainContract.ApiApps.CONTENT_URI,
|
||||||
|
contentValueForApiApps(appSettings));
|
||||||
|
context.getContentResolver().insert(KeychainContract.ApiAccounts.CONTENT_URI,
|
||||||
contentValueForApiApps(appSettings));
|
contentValueForApiApps(appSettings));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: uri not working because it is used for both tables
|
||||||
public static void updateApiApp(Context context, AppSettings appSettings, Uri uri) {
|
public static void updateApiApp(Context context, AppSettings appSettings, Uri uri) {
|
||||||
if (context.getContentResolver().update(uri, contentValueForApiApps(appSettings), null,
|
if (context.getContentResolver().update(uri, contentValueForApiApps(appSettings), null,
|
||||||
null) <= 0) {
|
null) <= 0) {
|
||||||
throw new RuntimeException();
|
throw new RuntimeException();
|
||||||
}
|
}
|
||||||
|
if (context.getContentResolver().update(uri, contentValueForApiAccounts(appSettings), null,
|
||||||
|
null) <= 0) {
|
||||||
|
throw new RuntimeException();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AppSettings getApiAppSettings(Context context, Uri uri) {
|
public static AppSettings getApiSettings(Context context, Uri uri) {
|
||||||
AppSettings settings = null;
|
AppSettings settings = null;
|
||||||
|
|
||||||
Cursor cur = context.getContentResolver().query(uri, null, null, null, null);
|
Cursor cur = context.getContentResolver().query(uri, null, null, null, null);
|
||||||
if (cur != null && cur.moveToFirst()) {
|
if (cur != null && cur.moveToFirst()) {
|
||||||
settings = new AppSettings();
|
settings = new AppSettings();
|
||||||
settings.setPackageName(cur.getString(cur
|
settings.setPackageName(cur.getString(cur
|
||||||
.getColumnIndex(KeychainContract.ApiApps.PACKAGE_NAME)));
|
.getColumnIndex(KeychainContract.Api.PACKAGE_NAME)));
|
||||||
settings.setPackageSignature(cur.getBlob(cur
|
settings.setPackageSignature(cur.getBlob(cur
|
||||||
.getColumnIndex(KeychainContract.ApiApps.PACKAGE_SIGNATURE)));
|
.getColumnIndex(KeychainContract.Api.PACKAGE_SIGNATURE)));
|
||||||
settings.setKeyId(cur.getLong(cur.getColumnIndex(KeychainContract.ApiApps.KEY_ID)));
|
settings.setKeyId(cur.getLong(cur.getColumnIndex(KeychainContract.Api.KEY_ID)));
|
||||||
settings.setCompression(cur.getInt(cur
|
settings.setCompression(cur.getInt(cur
|
||||||
.getColumnIndexOrThrow(KeychainContract.ApiApps.COMPRESSION)));
|
.getColumnIndexOrThrow(KeychainContract.Api.COMPRESSION)));
|
||||||
settings.setHashAlgorithm(cur.getInt(cur
|
settings.setHashAlgorithm(cur.getInt(cur
|
||||||
.getColumnIndexOrThrow(KeychainContract.ApiApps.HASH_ALORITHM)));
|
.getColumnIndexOrThrow(KeychainContract.Api.HASH_ALORITHM)));
|
||||||
settings.setEncryptionAlgorithm(cur.getInt(cur
|
settings.setEncryptionAlgorithm(cur.getInt(cur
|
||||||
.getColumnIndexOrThrow(KeychainContract.ApiApps.ENCRYPTION_ALGORITHM)));
|
.getColumnIndexOrThrow(KeychainContract.Api.ENCRYPTION_ALGORITHM)));
|
||||||
}
|
}
|
||||||
|
|
||||||
return settings;
|
return settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] getApiAppSignature(Context context, String packageName) {
|
public static byte[] getApiSignature(Context context, String packageName) {
|
||||||
Uri queryUri = KeychainContract.ApiApps.buildByPackageNameUri(packageName);
|
Uri queryUri = KeychainContract.Api.buildByPackageNameUri(packageName);
|
||||||
|
|
||||||
String[] projection = new String[]{ApiApps.PACKAGE_SIGNATURE};
|
String[] projection = new String[]{KeychainContract.Api.PACKAGE_SIGNATURE};
|
||||||
|
|
||||||
ContentResolver cr = context.getContentResolver();
|
ContentResolver cr = context.getContentResolver();
|
||||||
Cursor cursor = cr.query(queryUri, projection, null, null, null);
|
Cursor cursor = cr.query(queryUri, projection, null, null, null);
|
||||||
|
|||||||
Reference in New Issue
Block a user