blob: 109aa2128cfa3a1cf487e88b317a69677ef91e31 [file] [log] [blame]
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.security.cts;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.test.AndroidTestCase;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class SqliteJournalLeakTest extends AndroidTestCase {
private static final int REPEAT = 5;
private static final String[] DATABASES = {
"/com.android.bluetooth/databases/btopp.db",
"/com.android.browser/app_appcache/ApplicationCache.db",
"/com.android.browser/app_databases/Databases.db",
"/com.android.browser/app_geolocation/CachedGeoposition.db",
"/com.android.browser/app_geolocation/GeolocationPermissions.db",
"/com.android.browser/app_icons/WebpageIcons.db",
"/com.android.browser/databases/browser.db",
"/com.android.browser/databases/launcher.db",
"/com.android.browser/databases/webview.db",
"/com.android.browser/databases/webviewCache.db",
"/com.android.email/databases/EmailProvider.db",
"/com.android.email/databases/EmailProviderBody.db",
"/com.android.email/databases/webview.db",
"/com.android.email/databases/webviewCache.db",
"/com.android.providers.calendar/databases/calendar.db",
"/com.android.providers.contacts/databases/contacts2.db",
"/com.android.providers.downloads/databases/downloads.db",
"/com.android.providers.drm/databases/drm.db",
"/com.android.providers.media/databases/internal.db",
"/com.android.providers.settings/databases/settings.db",
"/com.android.providers.tasks/databases/tasks.db",
"/com.android.providers.telephony/optable.db",
"/com.android.providers.telephony/databases/mmssms.db",
"/com.android.providers.telephony/databases/nwk_info.db",
"/com.android.providers.telephony/databases/telephony.db",
"/com.android.providers.telephony/databases/tether_dun.db",
"/com.android.providers.userdictionary/databases/user_dict.db",
"/com.android.settings/databases/webview.db",
"/com.android.settings/databases/webviewCache.db",
"/com.android.vending/databases/billing4.db",
"/com.android.vending/databases/market_assets.db",
"/com.android.vending/databases/suggestions.db",
"/com.android.vending/databases/webview.db",
"/com.android.vending/databases/webviewCache.db"
};
/**
* This method triggers activities that should cause database writes.
* The goal of this is to try to make potentially short-lived journal
* files show up.
*/
private void doActivity() {
Intent webIntent = new Intent(Intent.ACTION_VIEW);
webIntent.setData(Uri.parse("http:///localhost"));
webIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getContext().startActivity(webIntent);
Intent dictIntent = new Intent("android.settings.USER_DICTIONARY_SETTINGS");
dictIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getContext().startActivity(dictIntent);
}
private void checkDatabases(String suffix) {
String msg = " is world readable. Please set its permissions to 600"
+ " by setting -DSQLITE_DEFAULT_FILE_PERMISSIONS=0600 in external/sqlite/dist/"
+ "Android.mk; see CVE-2011-3901.";
String base = Environment.getDataDirectory().getAbsolutePath();
for(int i=REPEAT; i > 0; i--) {
doActivity();
for (String name : DATABASES) {
name = base + "/data" + name + suffix;
File f = new File(name);
assertFalse(name + msg, f.canRead());
}
}
}
public void testJournal() {
checkDatabases("-journal");
}
public void testWal() {
checkDatabases("-wal");
}
public void testShm() {
checkDatabases("-shm");
}
}