mirror of
https://github.com/moparisthebest/open-keychain
synced 2024-11-23 17:22:16 -05:00
Fix constraints and insert
This commit is contained in:
parent
0edfd7ed48
commit
028af0c119
@ -21,6 +21,7 @@ import android.content.Context;
|
|||||||
import android.database.sqlite.SQLiteDatabase;
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
import android.database.sqlite.SQLiteOpenHelper;
|
import android.database.sqlite.SQLiteOpenHelper;
|
||||||
import android.provider.BaseColumns;
|
import android.provider.BaseColumns;
|
||||||
|
|
||||||
import org.sufficientlysecure.keychain.Constants;
|
import org.sufficientlysecure.keychain.Constants;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.ApiAppsColumns;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.ApiAppsColumns;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.ApiAppsAccountsColumns;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.ApiAppsAccountsColumns;
|
||||||
@ -63,33 +64,35 @@ public class KeychainDatabase extends SQLiteOpenHelper {
|
|||||||
+ KeysColumns.KEY_DATA + " BLOB,"
|
+ KeysColumns.KEY_DATA + " BLOB,"
|
||||||
+ KeysColumns.RANK + " INTEGER, "
|
+ KeysColumns.RANK + " INTEGER, "
|
||||||
+ KeysColumns.FINGERPRINT + " BLOB, "
|
+ KeysColumns.FINGERPRINT + " BLOB, "
|
||||||
+ KeysColumns.KEY_RING_ROW_ID + " INTEGER NOT NULL, FOREIGN KEY("
|
+ KeysColumns.KEY_RING_ROW_ID + " INTEGER NOT NULL, "
|
||||||
+ KeysColumns.KEY_RING_ROW_ID + ") REFERENCES " + Tables.KEY_RINGS + "("
|
+ "FOREIGN KEY(" + KeysColumns.KEY_RING_ROW_ID + ") REFERENCES "
|
||||||
+ BaseColumns._ID + ") ON DELETE CASCADE)";
|
+ Tables.KEY_RINGS + "(" + BaseColumns._ID + ") ON DELETE CASCADE)";
|
||||||
|
|
||||||
private static final String CREATE_USER_IDS = "CREATE TABLE IF NOT EXISTS " + Tables.USER_IDS
|
private static final String CREATE_USER_IDS = "CREATE TABLE IF NOT EXISTS " + Tables.USER_IDS
|
||||||
+ " (" + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
|
+ " (" + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
|
||||||
+ UserIdsColumns.USER_ID + " TEXT, "
|
+ UserIdsColumns.USER_ID + " TEXT, "
|
||||||
+ UserIdsColumns.RANK + " INTEGER, "
|
+ UserIdsColumns.RANK + " INTEGER, "
|
||||||
+ UserIdsColumns.KEY_RING_ROW_ID + " INTEGER NOT NULL, FOREIGN KEY("
|
+ UserIdsColumns.KEY_RING_ROW_ID + " INTEGER NOT NULL, "
|
||||||
+ UserIdsColumns.KEY_RING_ROW_ID + ") REFERENCES " + Tables.KEY_RINGS + "("
|
+ "FOREIGN KEY(" + UserIdsColumns.KEY_RING_ROW_ID + ") REFERENCES "
|
||||||
+ BaseColumns._ID + ") ON DELETE CASCADE)";
|
+ Tables.KEY_RINGS + "(" + BaseColumns._ID + ") ON DELETE CASCADE)";
|
||||||
|
|
||||||
private static final String CREATE_API_APPS = "CREATE TABLE IF NOT EXISTS " + Tables.API_APPS
|
private static final String CREATE_API_APPS = "CREATE TABLE IF NOT EXISTS " + Tables.API_APPS
|
||||||
+ " (" + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
|
+ " (" + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
|
||||||
+ ApiAppsColumns.PACKAGE_NAME + " TEXT UNIQUE, "
|
+ ApiAppsColumns.PACKAGE_NAME + " TEXT NOT NULL UNIQUE, "
|
||||||
+ ApiAppsColumns.PACKAGE_SIGNATURE + " BLOB)";
|
+ ApiAppsColumns.PACKAGE_SIGNATURE + " BLOB)";
|
||||||
|
|
||||||
private static final String CREATE_API_APPS_ACCOUNTS = "CREATE TABLE IF NOT EXISTS " + Tables.API_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.ACCOUNT_NAME + " TEXT UNIQUE, "
|
+ ApiAppsAccountsColumns.ACCOUNT_NAME + " TEXT NOT NULL, "
|
||||||
+ 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_FK + " TEXT NOT NULL, FOREIGN KEY("
|
+ ApiAppsAccountsColumns.PACKAGE_NAME_FK + " TEXT NOT NULL, "
|
||||||
+ ApiAppsAccountsColumns.PACKAGE_NAME_FK + ") REFERENCES " + Tables.API_APPS + "("
|
+ "UNIQUE(" + ApiAppsAccountsColumns.ACCOUNT_NAME + ", "
|
||||||
+ ApiAppsColumns.PACKAGE_NAME + ") ON DELETE CASCADE)";
|
+ ApiAppsAccountsColumns.PACKAGE_NAME_FK + "), "
|
||||||
|
+ "FOREIGN KEY(" + ApiAppsAccountsColumns.PACKAGE_NAME_FK + ") REFERENCES "
|
||||||
|
+ Tables.API_APPS + "(" + ApiAppsColumns.PACKAGE_NAME + ") ON DELETE CASCADE)";
|
||||||
|
|
||||||
KeychainDatabase(Context context) {
|
KeychainDatabase(Context context) {
|
||||||
super(context, DATABASE_NAME, null, DATABASE_VERSION);
|
super(context, DATABASE_NAME, null, DATABASE_VERSION);
|
||||||
|
@ -694,7 +694,7 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
+ Tables.API_APPS + "." + ApiApps.PACKAGE_NAME + " = " + Tables.API_ACCOUNTS + "."
|
+ Tables.API_APPS + "." + ApiApps.PACKAGE_NAME + " = " + Tables.API_ACCOUNTS + "."
|
||||||
+ ApiAccounts.PACKAGE_NAME_FK + " )");
|
+ ApiAccounts.PACKAGE_NAME_FK + " )");
|
||||||
qb.appendWhere(Tables.API_APPS + "." + ApiApps.PACKAGE_NAME + " = ");
|
qb.appendWhere(Tables.API_APPS + "." + ApiApps.PACKAGE_NAME + " = ");
|
||||||
qb.appendWhereEscapeString(uri.getPathSegments().get(2));
|
qb.appendWhereEscapeString(uri.getPathSegments().get(1));
|
||||||
|
|
||||||
qb.appendWhere(" AND " + Tables.API_ACCOUNTS + "." + ApiAccounts.ACCOUNT_NAME + " = ");
|
qb.appendWhere(" AND " + Tables.API_ACCOUNTS + "." + ApiAccounts.ACCOUNT_NAME + " = ");
|
||||||
qb.appendWhereEscapeString(uri.getLastPathSegment());
|
qb.appendWhereEscapeString(uri.getLastPathSegment());
|
||||||
@ -797,6 +797,13 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
case API_ACCOUNTS:
|
case API_ACCOUNTS:
|
||||||
|
// set foreign key automatically based on given uri
|
||||||
|
// e.g., api_apps/com.example.app/accounts/
|
||||||
|
String packageName = uri.getPathSegments().get(1);
|
||||||
|
values.put(ApiAccounts.PACKAGE_NAME_FK, packageName);
|
||||||
|
|
||||||
|
Log.d(Constants.TAG, "provider packageName: " + packageName);
|
||||||
|
|
||||||
rowId = db.insertOrThrow(Tables.API_ACCOUNTS, null, values);
|
rowId = db.insertOrThrow(Tables.API_ACCOUNTS, null, values);
|
||||||
// TODO: this is wrong:
|
// TODO: this is wrong:
|
||||||
// rowUri = ApiAccounts.buildIdUri(Long.toString(rowId));
|
// rowUri = ApiAccounts.buildIdUri(Long.toString(rowId));
|
||||||
@ -1046,7 +1053,7 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String buildDefaultApiAccountsSelection(Uri uri, String selection) {
|
private String buildDefaultApiAccountsSelection(Uri uri, String selection) {
|
||||||
String packageName = DatabaseUtils.sqlEscapeString(uri.getPathSegments().get(2));
|
String packageName = DatabaseUtils.sqlEscapeString(uri.getPathSegments().get(1));
|
||||||
String accountName = DatabaseUtils.sqlEscapeString(uri.getLastPathSegment());
|
String accountName = DatabaseUtils.sqlEscapeString(uri.getLastPathSegment());
|
||||||
|
|
||||||
String andSelection = "";
|
String andSelection = "";
|
||||||
|
@ -813,7 +813,6 @@ public class ProviderHelper {
|
|||||||
values.put(KeychainContract.ApiAccounts.COMPRESSION, accSettings.getCompression());
|
values.put(KeychainContract.ApiAccounts.COMPRESSION, accSettings.getCompression());
|
||||||
values.put(KeychainContract.ApiAccounts.ENCRYPTION_ALGORITHM, accSettings.getEncryptionAlgorithm());
|
values.put(KeychainContract.ApiAccounts.ENCRYPTION_ALGORITHM, accSettings.getEncryptionAlgorithm());
|
||||||
values.put(KeychainContract.ApiAccounts.HASH_ALORITHM, accSettings.getHashAlgorithm());
|
values.put(KeychainContract.ApiAccounts.HASH_ALORITHM, accSettings.getHashAlgorithm());
|
||||||
// values.put(KeychainContract.ApiAccounts.PACKAGE_NAME_FK, accSettings.getPackageName());
|
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -823,8 +822,7 @@ public class ProviderHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void insertApiAccount(Context context, Uri uri, AccountSettings accSettings) {
|
public static void insertApiAccount(Context context, Uri uri, AccountSettings accSettings) {
|
||||||
context.getContentResolver().insert(uri,
|
context.getContentResolver().insert(uri, contentValueForApiAccounts(accSettings));
|
||||||
contentValueForApiAccounts(accSettings));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void updateApiApp(Context context, AppSettings appSettings, Uri uri) {
|
public static void updateApiApp(Context context, AppSettings appSettings, Uri uri) {
|
||||||
@ -841,7 +839,6 @@ public class ProviderHelper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Must be an uri pointing to an account
|
* Must be an uri pointing to an account
|
||||||
*
|
*
|
||||||
@ -886,7 +883,7 @@ public class ProviderHelper {
|
|||||||
return settings;
|
return settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] getApiSignature(Context context, String packageName) {
|
public static byte[] getApiAppSignature(Context context, String packageName) {
|
||||||
Uri queryUri = ApiApps.buildByPackageNameUri(packageName);
|
Uri queryUri = ApiApps.buildByPackageNameUri(packageName);
|
||||||
|
|
||||||
String[] projection = new String[]{ApiApps.PACKAGE_SIGNATURE};
|
String[] projection = new String[]{ApiApps.PACKAGE_SIGNATURE};
|
||||||
|
@ -235,7 +235,7 @@ public abstract class RemoteService extends Service {
|
|||||||
throw new WrongPackageSignatureException(e.getMessage());
|
throw new WrongPackageSignatureException(e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
byte[] storedSig = ProviderHelper.getApiSignature(this, packageName);
|
byte[] storedSig = ProviderHelper.getApiAppSignature(this, packageName);
|
||||||
if (Arrays.equals(currentSig, storedSig)) {
|
if (Arrays.equals(currentSig, storedSig)) {
|
||||||
Log.d(Constants.TAG,
|
Log.d(Constants.TAG,
|
||||||
"Package signature is correct! (equals signature from database)");
|
"Package signature is correct! (equals signature from database)");
|
||||||
|
Loading…
Reference in New Issue
Block a user