Loading src/com/android/bluetooth/opp/BluetoothOppHandoverReceiver.java +2 −2 Original line number Diff line number Diff line Loading @@ -50,7 +50,7 @@ public class BluetoothOppHandoverReceiver extends BroadcastReceiver { // Save type/stream, will be used when adding transfer // session to DB. BluetoothOppManager.getInstance(context).saveSendingFileInfo(type, stream.toString(), true); stream.toString(), true /* isHandover */, true /* fromExternal */); } else { if (D) Log.d(TAG, "No mimeType or stream attached to handover request"); } Loading @@ -60,7 +60,7 @@ public class BluetoothOppHandoverReceiver extends BroadcastReceiver { uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); if (mimeType != null && uris != null) { BluetoothOppManager.getInstance(context).saveSendingFileInfo(mimeType, uris, true); uris, true /* isHandover */, true /* fromExternal */); } else { if (D) Log.d(TAG, "No mimeType or stream attached to handover request"); return; Loading src/com/android/bluetooth/opp/BluetoothOppLauncherActivity.java +6 −3 Original line number Diff line number Diff line Loading @@ -103,7 +103,8 @@ public class BluetoothOppLauncherActivity extends Activity { Thread t = new Thread(new Runnable() { public void run() { BluetoothOppManager.getInstance(BluetoothOppLauncherActivity.this) .saveSendingFileInfo(type,stream.toString(), false); .saveSendingFileInfo(type,stream.toString(), false /* isHandover */, true /* fromExternal */); //Done getting file info..Launch device picker and finish this activity launchDevicePicker(); finish(); Loading @@ -119,7 +120,8 @@ public class BluetoothOppLauncherActivity extends Activity { Thread t = new Thread(new Runnable() { public void run() { BluetoothOppManager.getInstance(BluetoothOppLauncherActivity.this) .saveSendingFileInfo(type,fileUri.toString(), false); .saveSendingFileInfo(type,fileUri.toString(), false /* isHandover */, false /* fromExternal */); //Done getting file info..Launch device picker //and finish this activity launchDevicePicker(); Loading Loading @@ -147,7 +149,8 @@ public class BluetoothOppLauncherActivity extends Activity { Thread t = new Thread(new Runnable() { public void run() { BluetoothOppManager.getInstance(BluetoothOppLauncherActivity.this) .saveSendingFileInfo(mimeType,uris, false); .saveSendingFileInfo(mimeType,uris, false /* isHandover */, true /* fromExternal */); //Done getting file info..Launch device picker //and finish this activity launchDevicePicker(); Loading src/com/android/bluetooth/opp/BluetoothOppManager.java +4 −4 Original line number Diff line number Diff line Loading @@ -246,7 +246,7 @@ public class BluetoothOppManager { if (V) Log.v(TAG, "Application data stored to SharedPreference! "); } public void saveSendingFileInfo(String mimeType, String uriString, boolean isHandover) { public void saveSendingFileInfo(String mimeType, String uriString, boolean isHandover, boolean fromExternal) { synchronized (BluetoothOppManager.this) { mMultipleFlag = false; mMimeTypeOfSendingFile = mimeType; Loading @@ -254,12 +254,12 @@ public class BluetoothOppManager { mIsHandoverInitiated = isHandover; Uri uri = Uri.parse(uriString); BluetoothOppUtility.putSendFileInfo(uri, BluetoothOppSendFileInfo.generateFileInfo(mContext, uri, mimeType)); BluetoothOppSendFileInfo.generateFileInfo(mContext, uri, mimeType, fromExternal)); storeApplicationData(); } } public void saveSendingFileInfo(String mimeType, ArrayList<Uri> uris, boolean isHandover) { public void saveSendingFileInfo(String mimeType, ArrayList<Uri> uris, boolean isHandover, boolean fromExternal) { synchronized (BluetoothOppManager.this) { mMultipleFlag = true; mMimeTypeOfSendingFiles = mimeType; Loading @@ -267,7 +267,7 @@ public class BluetoothOppManager { mIsHandoverInitiated = isHandover; for (Uri uri : uris) { BluetoothOppUtility.putSendFileInfo(uri, BluetoothOppSendFileInfo.generateFileInfo(mContext, uri, mimeType)); BluetoothOppSendFileInfo.generateFileInfo(mContext, uri, mimeType, fromExternal)); } storeApplicationData(); } Loading src/com/android/bluetooth/opp/BluetoothOppSendFileInfo.java +11 −1 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import android.database.Cursor; import android.database.sqlite.SQLiteException; import android.net.Uri; import android.provider.OpenableColumns; import android.util.EventLog; import android.util.Log; import java.io.File; Loading Loading @@ -98,7 +99,7 @@ public class BluetoothOppSendFileInfo { } public static BluetoothOppSendFileInfo generateFileInfo(Context context, Uri uri, String type) { String type, boolean fromExternal) { ContentResolver contentResolver = context.getContentResolver(); String scheme = uri.getScheme(); String fileName = null; Loading Loading @@ -134,6 +135,15 @@ public class BluetoothOppSendFileInfo { fileName = uri.getLastPathSegment(); } } else if ("file".equals(scheme)) { if (uri.getPath() == null) { Log.e(TAG, "Invalid URI path: " + uri); return SEND_FILE_INFO_ERROR; } if (fromExternal && !BluetoothOppUtility.isInExternalStorageDir(uri)) { EventLog.writeEvent(0x534e4554, "35310991", -1, uri.getPath()); Log.e(TAG, "File based URI not in Environment.getExternalStorageDirectory() is not allowed."); return SEND_FILE_INFO_ERROR; } fileName = uri.getLastPathSegment(); contentType = type; File f = new File(uri.getPath()); Loading src/com/android/bluetooth/opp/BluetoothOppUtility.java +38 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import com.google.android.collect.Lists; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.net.Uri; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.content.ActivityNotFoundException; Loading @@ -46,6 +47,7 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.database.Cursor; import android.os.Environment; import android.util.Log; import java.io.File; Loading Loading @@ -329,4 +331,40 @@ public class BluetoothOppUtility { } } } /** * Checks if the URI is in Environment.getExternalStorageDirectory() as it * is the only directory that is possibly readable by both the sender and * the Bluetooth process. */ static boolean isInExternalStorageDir(Uri uri) { if (!ContentResolver.SCHEME_FILE.equals(uri.getScheme())) { Log.e(TAG, "Not a file URI: " + uri); return false; } final File file = new File(uri.getCanonicalUri().getPath()); return isSameOrSubDirectory(Environment.getExternalStorageDirectory(), file); } /** * Checks, whether the child directory is the same as, or a sub-directory of the base * directory. Neither base nor child should be null. */ static boolean isSameOrSubDirectory(File base, File child) { try { base = base.getCanonicalFile(); child = child.getCanonicalFile(); File parentFile = child; while (parentFile != null) { if (base.equals(parentFile)) { return true; } parentFile = parentFile.getParentFile(); } return false; } catch (IOException ex) { Log.e(TAG, "Error while accessing file", ex); return false; } } } Loading
src/com/android/bluetooth/opp/BluetoothOppHandoverReceiver.java +2 −2 Original line number Diff line number Diff line Loading @@ -50,7 +50,7 @@ public class BluetoothOppHandoverReceiver extends BroadcastReceiver { // Save type/stream, will be used when adding transfer // session to DB. BluetoothOppManager.getInstance(context).saveSendingFileInfo(type, stream.toString(), true); stream.toString(), true /* isHandover */, true /* fromExternal */); } else { if (D) Log.d(TAG, "No mimeType or stream attached to handover request"); } Loading @@ -60,7 +60,7 @@ public class BluetoothOppHandoverReceiver extends BroadcastReceiver { uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); if (mimeType != null && uris != null) { BluetoothOppManager.getInstance(context).saveSendingFileInfo(mimeType, uris, true); uris, true /* isHandover */, true /* fromExternal */); } else { if (D) Log.d(TAG, "No mimeType or stream attached to handover request"); return; Loading
src/com/android/bluetooth/opp/BluetoothOppLauncherActivity.java +6 −3 Original line number Diff line number Diff line Loading @@ -103,7 +103,8 @@ public class BluetoothOppLauncherActivity extends Activity { Thread t = new Thread(new Runnable() { public void run() { BluetoothOppManager.getInstance(BluetoothOppLauncherActivity.this) .saveSendingFileInfo(type,stream.toString(), false); .saveSendingFileInfo(type,stream.toString(), false /* isHandover */, true /* fromExternal */); //Done getting file info..Launch device picker and finish this activity launchDevicePicker(); finish(); Loading @@ -119,7 +120,8 @@ public class BluetoothOppLauncherActivity extends Activity { Thread t = new Thread(new Runnable() { public void run() { BluetoothOppManager.getInstance(BluetoothOppLauncherActivity.this) .saveSendingFileInfo(type,fileUri.toString(), false); .saveSendingFileInfo(type,fileUri.toString(), false /* isHandover */, false /* fromExternal */); //Done getting file info..Launch device picker //and finish this activity launchDevicePicker(); Loading Loading @@ -147,7 +149,8 @@ public class BluetoothOppLauncherActivity extends Activity { Thread t = new Thread(new Runnable() { public void run() { BluetoothOppManager.getInstance(BluetoothOppLauncherActivity.this) .saveSendingFileInfo(mimeType,uris, false); .saveSendingFileInfo(mimeType,uris, false /* isHandover */, true /* fromExternal */); //Done getting file info..Launch device picker //and finish this activity launchDevicePicker(); Loading
src/com/android/bluetooth/opp/BluetoothOppManager.java +4 −4 Original line number Diff line number Diff line Loading @@ -246,7 +246,7 @@ public class BluetoothOppManager { if (V) Log.v(TAG, "Application data stored to SharedPreference! "); } public void saveSendingFileInfo(String mimeType, String uriString, boolean isHandover) { public void saveSendingFileInfo(String mimeType, String uriString, boolean isHandover, boolean fromExternal) { synchronized (BluetoothOppManager.this) { mMultipleFlag = false; mMimeTypeOfSendingFile = mimeType; Loading @@ -254,12 +254,12 @@ public class BluetoothOppManager { mIsHandoverInitiated = isHandover; Uri uri = Uri.parse(uriString); BluetoothOppUtility.putSendFileInfo(uri, BluetoothOppSendFileInfo.generateFileInfo(mContext, uri, mimeType)); BluetoothOppSendFileInfo.generateFileInfo(mContext, uri, mimeType, fromExternal)); storeApplicationData(); } } public void saveSendingFileInfo(String mimeType, ArrayList<Uri> uris, boolean isHandover) { public void saveSendingFileInfo(String mimeType, ArrayList<Uri> uris, boolean isHandover, boolean fromExternal) { synchronized (BluetoothOppManager.this) { mMultipleFlag = true; mMimeTypeOfSendingFiles = mimeType; Loading @@ -267,7 +267,7 @@ public class BluetoothOppManager { mIsHandoverInitiated = isHandover; for (Uri uri : uris) { BluetoothOppUtility.putSendFileInfo(uri, BluetoothOppSendFileInfo.generateFileInfo(mContext, uri, mimeType)); BluetoothOppSendFileInfo.generateFileInfo(mContext, uri, mimeType, fromExternal)); } storeApplicationData(); } Loading
src/com/android/bluetooth/opp/BluetoothOppSendFileInfo.java +11 −1 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import android.database.Cursor; import android.database.sqlite.SQLiteException; import android.net.Uri; import android.provider.OpenableColumns; import android.util.EventLog; import android.util.Log; import java.io.File; Loading Loading @@ -98,7 +99,7 @@ public class BluetoothOppSendFileInfo { } public static BluetoothOppSendFileInfo generateFileInfo(Context context, Uri uri, String type) { String type, boolean fromExternal) { ContentResolver contentResolver = context.getContentResolver(); String scheme = uri.getScheme(); String fileName = null; Loading Loading @@ -134,6 +135,15 @@ public class BluetoothOppSendFileInfo { fileName = uri.getLastPathSegment(); } } else if ("file".equals(scheme)) { if (uri.getPath() == null) { Log.e(TAG, "Invalid URI path: " + uri); return SEND_FILE_INFO_ERROR; } if (fromExternal && !BluetoothOppUtility.isInExternalStorageDir(uri)) { EventLog.writeEvent(0x534e4554, "35310991", -1, uri.getPath()); Log.e(TAG, "File based URI not in Environment.getExternalStorageDirectory() is not allowed."); return SEND_FILE_INFO_ERROR; } fileName = uri.getLastPathSegment(); contentType = type; File f = new File(uri.getPath()); Loading
src/com/android/bluetooth/opp/BluetoothOppUtility.java +38 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import com.google.android.collect.Lists; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.net.Uri; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.content.ActivityNotFoundException; Loading @@ -46,6 +47,7 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.database.Cursor; import android.os.Environment; import android.util.Log; import java.io.File; Loading Loading @@ -329,4 +331,40 @@ public class BluetoothOppUtility { } } } /** * Checks if the URI is in Environment.getExternalStorageDirectory() as it * is the only directory that is possibly readable by both the sender and * the Bluetooth process. */ static boolean isInExternalStorageDir(Uri uri) { if (!ContentResolver.SCHEME_FILE.equals(uri.getScheme())) { Log.e(TAG, "Not a file URI: " + uri); return false; } final File file = new File(uri.getCanonicalUri().getPath()); return isSameOrSubDirectory(Environment.getExternalStorageDirectory(), file); } /** * Checks, whether the child directory is the same as, or a sub-directory of the base * directory. Neither base nor child should be null. */ static boolean isSameOrSubDirectory(File base, File child) { try { base = base.getCanonicalFile(); child = child.getCanonicalFile(); File parentFile = child; while (parentFile != null) { if (base.equals(parentFile)) { return true; } parentFile = parentFile.getParentFile(); } return false; } catch (IOException ex) { Log.e(TAG, "Error while accessing file", ex); return false; } } }