You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by bo...@apache.org on 2015/10/28 20:01:31 UTC
[2/3] cordova-plugin-file git commit: Adding permissions,
giving read seems to give write access as well
Adding permissions, giving read seems to give write access as well
Project: http://git-wip-us.apache.org/repos/asf/cordova-plugin-file/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugin-file/commit/69aa561d
Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugin-file/tree/69aa561d
Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugin-file/diff/69aa561d
Branch: refs/heads/master
Commit: 69aa561dc1eb19cbf8eaa4422ae359c1b215e39c
Parents: e093e8d
Author: Joe Bowser <bo...@apache.org>
Authored: Mon Sep 28 11:06:39 2015 -0700
Committer: Joe Bowser <bo...@apache.org>
Committed: Wed Oct 28 10:39:06 2015 -0700
----------------------------------------------------------------------
src/android/FileUtils.java | 97 +++++++++++++++++++++++++++++++++++++++--
1 file changed, 94 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cordova-plugin-file/blob/69aa561d/src/android/FileUtils.java
----------------------------------------------------------------------
diff --git a/src/android/FileUtils.java b/src/android/FileUtils.java
index c90a61d..c690cb5 100644
--- a/src/android/FileUtils.java
+++ b/src/android/FileUtils.java
@@ -18,9 +18,12 @@
*/
package org.apache.cordova.file;
+import android.Manifest;
import android.app.Activity;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.net.Uri;
+import android.os.Build;
import android.os.Environment;
import android.util.Base64;
import android.util.Log;
@@ -41,6 +44,7 @@ import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
+import java.security.Permission;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -65,9 +69,27 @@ public class FileUtils extends CordovaPlugin {
public static int TYPE_MISMATCH_ERR = 11;
public static int PATH_EXISTS_ERR = 12;
+ /*
+ * Permission callback codes
+ */
+
+ public static final int READ_PERM = 0;
+ public static final int WRITE_PERM = 1;
+
public static int UNKNOWN_ERR = 1000;
private boolean configured = false;
+ private String lastRawArgs;
+
+ private CallbackContext callback;
+
+ /*
+ * We need both read and write when accessing the storage, I think.
+ */
+
+ private String [] permissions = {
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE };
// This field exists only to support getEntry, below, which has been deprecated
private static FileUtils filePlugin;
@@ -237,6 +259,8 @@ public class FileUtils extends CordovaPlugin {
}
public boolean execute(String action, final String rawArgs, final CallbackContext callbackContext) {
+ this.callback = callbackContext;
+ lastRawArgs = rawArgs;
if (!configured) {
callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, "File plugin is not configured. Please see the README.md file for details on how to update config.xml"));
return true;
@@ -412,9 +436,18 @@ public class FileUtils extends CordovaPlugin {
threadhelper( new FileOp( ){
public void run(JSONArray args) throws FileExistsException, IOException, TypeMismatchException, EncodingException, JSONException {
String dirname=args.getString(0);
- String path=args.getString(1);
- JSONObject obj = getFile(dirname, path, args.optJSONObject(2), false);
- callbackContext.success(obj);
+ /*
+ * If we don't have the package name in the path, we're reading and writing to places we need permission for
+ */
+ if(dirname.contains(cordova.getActivity().getPackageName()) ||
+ hasReadPermission()) {
+ String path = args.getString(1);
+ JSONObject obj = getFile(dirname, path, args.optJSONObject(2), false);
+ callbackContext.success(obj);
+ }
+ else {
+ getReadPermission();
+ }
}
}, rawArgs, callbackContext);
}
@@ -492,6 +525,30 @@ public class FileUtils extends CordovaPlugin {
return true;
}
+ private void getReadPermission() {
+ cordova.requestPermission(this, READ_PERM, Manifest.permission.READ_EXTERNAL_STORAGE);
+ }
+
+ private void getWritePermission() {
+ cordova.requestPermission(this, WRITE_PERM, Manifest.permission.WRITE_EXTERNAL_STORAGE);
+ }
+
+
+ private boolean hasReadPermission() {
+ if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
+ return PackageManager.PERMISSION_GRANTED == cordova.getActivity().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
+ else
+ return true;
+ }
+
+ private boolean hasWritePermission() {
+ if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
+ return PackageManager.PERMISSION_GRANTED == cordova.getActivity().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
+ else
+ return true;
+ }
+
+
public LocalFilesystemURL resolveNativeUri(Uri nativeUri) {
LocalFilesystemURL localURL = null;
@@ -1019,4 +1076,38 @@ public class FileUtils extends CordovaPlugin {
throw new MalformedURLException("Unrecognized filesystem URL");
}
}
+
+
+ /*
+ * Handle the response
+ */
+
+ public void onRequestPermissionResult(int requestCode, String[] permissions,
+ int[] grantResults) throws JSONException {
+ for(int r:grantResults)
+ {
+ if(r == PackageManager.PERMISSION_DENIED)
+ {
+ callback.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, SECURITY_ERR));
+ }
+ }
+ switch(requestCode)
+ {
+ case READ_PERM:
+ threadhelper( new FileOp( ){
+ public void run(JSONArray args) throws FileExistsException, IOException, TypeMismatchException, EncodingException, JSONException {
+ String dirname=args.getString(0);
+
+ String path = args.getString(1);
+ JSONObject obj = getFile(dirname, path, args.optJSONObject(2), false);
+ callback.success(obj);
+ }
+ }, lastRawArgs, callback);
+ break;
+ case WRITE_PERM:
+
+ break;
+ }
+
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org