Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(android): permissions use "publicStorage" as alias #202

Merged
merged 2 commits into from
Jan 21, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,14 @@
@CapacitorPlugin(
name = "Filesystem",
permissions = {
@Permission(strings = { Manifest.permission.READ_EXTERNAL_STORAGE }, alias = FilesystemPlugin.READ_STORAGE),
@Permission(strings = { Manifest.permission.WRITE_EXTERNAL_STORAGE }, alias = FilesystemPlugin.WRITE_STORAGE)
@Permission(
strings = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE },
alias = "publicStorage"
)
}
)
public class FilesystemPlugin extends Plugin {

static final String READ_STORAGE = "readStorage";
static final String WRITE_STORAGE = "writeStorage";

private Filesystem implementation;

@Override
Expand All @@ -40,7 +39,7 @@ public void load() {

private static final String PERMISSION_DENIED_ERROR = "Unable to do file operation, user denied permission request";

@PluginMethod(permissionCallback = "readPermissionsCallback")
@PluginMethod(permissionCallback = "permissionCallback")
public void readFile(PluginCall call) {
String path = call.getString("path");
String directory = getDirectoryParameter(call);
Expand All @@ -52,8 +51,8 @@ public void readFile(PluginCall call) {
return;
}

if (!isPublicDirectory(directory) && !isStoragePermissionGranted(READ_STORAGE)) {
requestPermissionForAlias(READ_STORAGE, call);
if (!isPublicDirectory(directory) && !isStoragePermissionGranted()) {
requestAllPermissions(call);
} else {
try {
String dataStr = implementation.readFile(path, directory, charset);
Expand All @@ -70,7 +69,7 @@ public void readFile(PluginCall call) {
}
}

@PluginMethod(permissionCallback = "writePermissionsCallback")
@PluginMethod(permissionCallback = "permissionCallback")
public void writeFile(PluginCall call) {
String path = call.getString("path");
String data = call.getString("data");
Expand All @@ -90,8 +89,8 @@ public void writeFile(PluginCall call) {

String directory = getDirectoryParameter(call);
if (directory != null) {
if (!isPublicDirectory(directory) && !isStoragePermissionGranted(WRITE_STORAGE)) {
requestPermissionForAlias(WRITE_STORAGE, call);
if (!isPublicDirectory(directory) && !isStoragePermissionGranted()) {
requestAllPermissions(call);
} else {
// create directory because it might not exist
File androidDir = implementation.getDirectory(directory);
Expand Down Expand Up @@ -120,8 +119,8 @@ public void writeFile(PluginCall call) {
File fileObject = new File(u.getPath());
// do not know where the file is being store so checking the permission to be secure
// TODO to prevent permission checking we need a property from the call
if (!isStoragePermissionGranted(WRITE_STORAGE)) {
requestPermissionForAlias(WRITE_STORAGE, call);
if (!isStoragePermissionGranted()) {
requestAllPermissions(call);
} else {
if (fileObject.getParentFile().exists() || (recursive && fileObject.getParentFile().mkdirs())) {
saveFile(call, fileObject, data);
Expand Down Expand Up @@ -163,7 +162,7 @@ private void saveFile(PluginCall call, File file, String data) {
}
}

@PluginMethod(permissionCallback = "writePermissionsCallback")
@PluginMethod(permissionCallback = "permissionCallback")
public void appendFile(PluginCall call) {
try {
call.getData().putOpt("append", true);
Expand All @@ -172,12 +171,12 @@ public void appendFile(PluginCall call) {
this.writeFile(call);
}

@PluginMethod(permissionCallback = "writePermissionsCallback")
@PluginMethod(permissionCallback = "permissionCallback")
public void deleteFile(PluginCall call) {
String file = call.getString("path");
String directory = getDirectoryParameter(call);
if (!isPublicDirectory(directory) && !isStoragePermissionGranted(WRITE_STORAGE)) {
requestPermissionForAlias(WRITE_STORAGE, call);
if (!isPublicDirectory(directory) && !isStoragePermissionGranted()) {
requestAllPermissions(call);
} else {
try {
boolean deleted = implementation.deleteFile(file, directory);
Expand All @@ -192,13 +191,13 @@ public void deleteFile(PluginCall call) {
}
}

@PluginMethod(permissionCallback = "writePermissionsCallback")
@PluginMethod(permissionCallback = "permissionCallback")
public void mkdir(PluginCall call) {
String path = call.getString("path");
String directory = getDirectoryParameter(call);
boolean recursive = call.getBoolean("recursive", false).booleanValue();
if (!isPublicDirectory(directory) && !isStoragePermissionGranted(WRITE_STORAGE)) {
requestPermissionForAlias(WRITE_STORAGE, call);
if (!isPublicDirectory(directory) && !isStoragePermissionGranted()) {
requestAllPermissions(call);
} else {
try {
boolean created = implementation.mkdir(path, directory, recursive);
Expand All @@ -213,16 +212,16 @@ public void mkdir(PluginCall call) {
}
}

@PluginMethod(permissionCallback = "writePermissionsCallback")
@PluginMethod(permissionCallback = "permissionCallback")
public void rmdir(PluginCall call) {
String path = call.getString("path");
String directory = getDirectoryParameter(call);
Boolean recursive = call.getBoolean("recursive", false);

File fileObject = implementation.getFileObject(path, directory);

if (!isPublicDirectory(directory) && !isStoragePermissionGranted(WRITE_STORAGE)) {
requestPermissionForAlias(WRITE_STORAGE, call);
if (!isPublicDirectory(directory) && !isStoragePermissionGranted()) {
requestAllPermissions(call);
} else {
if (!fileObject.exists()) {
call.reject("Directory does not exist");
Expand All @@ -249,13 +248,13 @@ public void rmdir(PluginCall call) {
}
}

@PluginMethod(permissionCallback = "readPermissionsCallback")
@PluginMethod(permissionCallback = "permissionCallback")
public void readdir(PluginCall call) {
String path = call.getString("path");
String directory = getDirectoryParameter(call);

if (!isPublicDirectory(directory) && !isStoragePermissionGranted(READ_STORAGE)) {
requestPermissionForAlias(READ_STORAGE, call);
if (!isPublicDirectory(directory) && !isStoragePermissionGranted()) {
requestAllPermissions(call);
} else {
try {
String[] files = implementation.readdir(path, directory);
Expand All @@ -272,31 +271,31 @@ public void readdir(PluginCall call) {
}
}

@PluginMethod(permissionCallback = "readPermissionsCallback")
@PluginMethod(permissionCallback = "permissionCallback")
public void getUri(PluginCall call) {
String path = call.getString("path");
String directory = getDirectoryParameter(call);

File fileObject = implementation.getFileObject(path, directory);

if (!isPublicDirectory(directory) && !isStoragePermissionGranted(READ_STORAGE)) {
requestPermissionForAlias(READ_STORAGE, call);
if (!isPublicDirectory(directory) && !isStoragePermissionGranted()) {
requestAllPermissions(call);
} else {
JSObject data = new JSObject();
data.put("uri", Uri.fromFile(fileObject).toString());
call.resolve(data);
}
}

@PluginMethod(permissionCallback = "readPermissionsCallback")
@PluginMethod(permissionCallback = "permissionCallback")
public void stat(PluginCall call) {
String path = call.getString("path");
String directory = getDirectoryParameter(call);

File fileObject = implementation.getFileObject(path, directory);

if (!isPublicDirectory(directory) && !isStoragePermissionGranted(READ_STORAGE)) {
requestPermissionForAlias(READ_STORAGE, call);
if (!isPublicDirectory(directory) && !isStoragePermissionGranted()) {
requestAllPermissions(call);
} else {
if (!fileObject.exists()) {
call.reject("File does not exist");
Expand All @@ -313,12 +312,12 @@ public void stat(PluginCall call) {
}
}

@PluginMethod(permissionCallback = "writePermissionsCallback")
@PluginMethod(permissionCallback = "permissionCallback")
public void rename(PluginCall call) {
this._copy(call, true);
}

@PluginMethod(permissionCallback = "writePermissionsCallback")
@PluginMethod(permissionCallback = "permissionCallback")
public void copy(PluginCall call) {
this._copy(call, false);
}
Expand All @@ -334,8 +333,8 @@ private void _copy(PluginCall call, Boolean doRename) {
return;
}
if (isPublicDirectory(directory) || isPublicDirectory(toDirectory)) {
if (!isStoragePermissionGranted(WRITE_STORAGE)) {
requestPermissionForAlias(WRITE_STORAGE, call);
if (!isStoragePermissionGranted()) {
requestAllPermissions(call);
return;
}
}
Expand All @@ -348,32 +347,9 @@ private void _copy(PluginCall call, Boolean doRename) {
}
}

private void readPermissionsCallback(PluginCall call) {
if (getPermissionState(READ_STORAGE) != PermissionState.GRANTED) {
Logger.debug(getLogTag(), "User denied read storage permission");
call.reject(PERMISSION_DENIED_ERROR);
return;
}

switch (call.getMethodName()) {
case "readFile":
readFile(call);
break;
case "readdir":
readdir(call);
break;
case "getUri":
getUri(call);
break;
case "stat":
stat(call);
break;
}
}

private void writePermissionsCallback(PluginCall call) {
if (getPermissionState(WRITE_STORAGE) != PermissionState.GRANTED) {
Logger.debug(getLogTag(), "User denied write storage permission");
private void permissionCallback(PluginCall call) {
if (!isStoragePermissionGranted()) {
Logger.debug(getLogTag(), "User denied storage permission");
call.reject(PERMISSION_DENIED_ERROR);
return;
}
Expand All @@ -398,16 +374,27 @@ private void writePermissionsCallback(PluginCall call) {
case "copy":
copy(call);
break;
case "readFile":
readFile(call);
break;
case "readdir":
readdir(call);
break;
case "getUri":
getUri(call);
break;
case "stat":
stat(call);
break;
}
}

/**
* Checks the the given permission is granted or not
* @param alias the permission alias "readStorage" or "writeStorage"
* @return Returns true if the permission is granted and false if it is denied.
*/
private boolean isStoragePermissionGranted(String alias) {
return getPermissionState(alias) == PermissionState.GRANTED;
private boolean isStoragePermissionGranted() {
return getPermissionState("publicStorage") == PermissionState.GRANTED;
}

/**
Expand Down