From 5dea97cce282f406b211547665ae8af1ce393bac Mon Sep 17 00:00:00 2001 From: Gilbert Gilb's Date: Mon, 27 Aug 2018 20:57:30 +0200 Subject: [PATCH] Add PCloud support. --- .../JavaFileStorageBindings.csproj | 5 +- src/KeePass.sln | 12 + src/Kp2aBusinessLogic/Io/PCloudFileStorage.cs | 23 + .../Kp2aBusinessLogic.csproj | 3 +- .../Additions/AboutAdditions.txt | 48 +++ src/PCloudBindings/Jars/AboutJars.txt | 24 ++ .../Jars/pcloud-sdk-android-1.0.1.aar | Bin 0 -> 9486 bytes .../Jars/pcloud-sdk-java-core-1.0.1.jar | Bin 0 -> 83567 bytes src/PCloudBindings/PCloudBindings.csproj | 75 ++++ src/PCloudBindings/Properties/AssemblyInfo.cs | 30 ++ src/PCloudBindings/Transforms/EnumFields.xml | 14 + src/PCloudBindings/Transforms/EnumMethods.xml | 13 + src/PCloudBindings/Transforms/Metadata.xml | 9 + src/java/JavaFileStorage/app/build.gradle | 2 + .../javafilestorage/JavaFileStorage.java | 4 +- .../javafilestorage/PCloudFileStorage.java | 402 ++++++++++++++++++ .../drawable-mdpi/ic_storage_pcloud.png | Bin 0 -> 861 bytes .../drawable-xhdpi/ic_storage_pcloud.png | Bin 0 -> 2041 bytes .../Resources/values/strings.xml | 1 + src/keepass2android/app/App.cs | 2 + src/keepass2android/keepass2android.csproj | 10 +- 21 files changed, 672 insertions(+), 5 deletions(-) create mode 100644 src/Kp2aBusinessLogic/Io/PCloudFileStorage.cs create mode 100644 src/PCloudBindings/Additions/AboutAdditions.txt create mode 100644 src/PCloudBindings/Jars/AboutJars.txt create mode 100644 src/PCloudBindings/Jars/pcloud-sdk-android-1.0.1.aar create mode 100644 src/PCloudBindings/Jars/pcloud-sdk-java-core-1.0.1.jar create mode 100644 src/PCloudBindings/PCloudBindings.csproj create mode 100644 src/PCloudBindings/Properties/AssemblyInfo.cs create mode 100644 src/PCloudBindings/Transforms/EnumFields.xml create mode 100644 src/PCloudBindings/Transforms/EnumMethods.xml create mode 100644 src/PCloudBindings/Transforms/Metadata.xml create mode 100644 src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/PCloudFileStorage.java create mode 100644 src/keepass2android/Resources/drawable-mdpi/ic_storage_pcloud.png create mode 100644 src/keepass2android/Resources/drawable-xhdpi/ic_storage_pcloud.png diff --git a/src/JavaFileStorageBindings/JavaFileStorageBindings.csproj b/src/JavaFileStorageBindings/JavaFileStorageBindings.csproj index 8646b9f2..d6377c99 100644 --- a/src/JavaFileStorageBindings/JavaFileStorageBindings.csproj +++ b/src/JavaFileStorageBindings/JavaFileStorageBindings.csproj @@ -81,6 +81,9 @@ False + + + @@ -150,4 +153,4 @@ - \ No newline at end of file + diff --git a/src/KeePass.sln b/src/KeePass.sln index a2837f93..845d2961 100644 --- a/src/KeePass.sln +++ b/src/KeePass.sln @@ -27,6 +27,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Net.FtpClient.Androi EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SamsungPass", "SamsungPass\Xamarin.SamsungPass\SamsungPass\SamsungPass.csproj", "{3A4B8E88-FA9B-4663-BCDA-21C12E3AF98A}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PCloudBindings", "PCloudBindings\PCloudBindings.csproj", "{2DB80C77-D46F-4970-B967-E9FFA9B2AC2E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -283,6 +285,16 @@ Global {3A4B8E88-FA9B-4663-BCDA-21C12E3AF98A}.ReleaseNoNet|Mixed Platforms.Build.0 = ReleaseNoNet|Any CPU {3A4B8E88-FA9B-4663-BCDA-21C12E3AF98A}.ReleaseNoNet|Win32.ActiveCfg = ReleaseNoNet|Any CPU {3A4B8E88-FA9B-4663-BCDA-21C12E3AF98A}.ReleaseNoNet|x64.ActiveCfg = ReleaseNoNet|Any CPU + {48574278-4779-4B3A-A9E4-9CF1BC285D0B}.Debug|Win32.Build.0 = Debug|Any CPU + {48574278-4779-4B3A-A9E4-9CF1BC285D0B}.Debug|x64.Build.0 = Debug|Any CPU + {48574278-4779-4B3A-A9E4-9CF1BC285D0B}.Release|Win32.Build.0 = Release|Any CPU + {48574278-4779-4B3A-A9E4-9CF1BC285D0B}.Release|x64.Build.0 = Release|Any CPU + {48574278-4779-4B3A-A9E4-9CF1BC285D0B}.ReleaseNoNet|Any CPU.ActiveCfg = ReleaseNoNet|Any CPU + {48574278-4779-4B3A-A9E4-9CF1BC285D0B}.ReleaseNoNet|Any CPU.Build.0 = ReleaseNoNet|Any CPU + {48574278-4779-4B3A-A9E4-9CF1BC285D0B}.ReleaseNoNet|Win32.ActiveCfg = ReleaseNoNet|Any CPU + {48574278-4779-4B3A-A9E4-9CF1BC285D0B}.ReleaseNoNet|Win32.Build.0 = ReleaseNoNet|Any CPU + {48574278-4779-4B3A-A9E4-9CF1BC285D0B}.ReleaseNoNet|x64.ActiveCfg = ReleaseNoNet|Any CPU + {48574278-4779-4B3A-A9E4-9CF1BC285D0B}.ReleaseNoNet|x64.Build.0 = ReleaseNoNet|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/Kp2aBusinessLogic/Io/PCloudFileStorage.cs b/src/Kp2aBusinessLogic/Io/PCloudFileStorage.cs new file mode 100644 index 00000000..9f7449ef --- /dev/null +++ b/src/Kp2aBusinessLogic/Io/PCloudFileStorage.cs @@ -0,0 +1,23 @@ +using Android.Content; +#if !EXCLUDE_JAVAFILESTORAGE + +namespace keepass2android.Io +{ + public partial class PCloudFileStorage: JavaFileStorage + { + private const string ClientId = "CkRWTQXY6Lm"; + + public PCloudFileStorage(Context ctx, IKp2aApp app) : + base(new Keepass2android.Javafilestorage.PCloudFileStorage(ctx, ClientId), app) + { + } + + + public override bool UserShouldBackup + { + get { return false; } + } + } + +} +#endif \ No newline at end of file diff --git a/src/Kp2aBusinessLogic/Kp2aBusinessLogic.csproj b/src/Kp2aBusinessLogic/Kp2aBusinessLogic.csproj index de62cce7..cec263bb 100644 --- a/src/Kp2aBusinessLogic/Kp2aBusinessLogic.csproj +++ b/src/Kp2aBusinessLogic/Kp2aBusinessLogic.csproj @@ -117,6 +117,7 @@ + @@ -215,4 +216,4 @@ --> - + \ No newline at end of file diff --git a/src/PCloudBindings/Additions/AboutAdditions.txt b/src/PCloudBindings/Additions/AboutAdditions.txt new file mode 100644 index 00000000..08caee33 --- /dev/null +++ b/src/PCloudBindings/Additions/AboutAdditions.txt @@ -0,0 +1,48 @@ +Additions allow you to add arbitrary C# to the generated classes +before they are compiled. This can be helpful for providing convenience +methods or adding pure C# classes. + +== Adding Methods to Generated Classes == + +Let's say the library being bound has a Rectangle class with a constructor +that takes an x and y position, and a width and length size. It will look like +this: + +public partial class Rectangle +{ + public Rectangle (int x, int y, int width, int height) + { + // JNI bindings + } +} + +Imagine we want to add a constructor to this class that takes a Point and +Size structure instead of 4 ints. We can add a new file called Rectangle.cs +with a partial class containing our new method: + +public partial class Rectangle +{ + public Rectangle (Point location, Size size) : + this (location.X, location.Y, size.Width, size.Height) + { + } +} + +At compile time, the additions class will be added to the generated class +and the final assembly will a Rectangle class with both constructors. + + +== Adding C# Classes == + +Another thing that can be done is adding fully C# managed classes to the +generated library. In the above example, let's assume that there isn't a +Point class available in Java or our library. The one we create doesn't need +to interact with Java, so we'll create it like a normal class in C#. + +By adding a Point.cs file with this class, it will end up in the binding library: + +public class Point +{ + public int X { get; set; } + public int Y { get; set; } +} \ No newline at end of file diff --git a/src/PCloudBindings/Jars/AboutJars.txt b/src/PCloudBindings/Jars/AboutJars.txt new file mode 100644 index 00000000..c359b62f --- /dev/null +++ b/src/PCloudBindings/Jars/AboutJars.txt @@ -0,0 +1,24 @@ +This directory is for Android .jars. + +There are 2 types of jars that are supported: + +== Input Jar == + +This is the jar that bindings should be generated for. + +For example, if you were binding the Google Maps library, this would +be Google's "maps.jar". + +Set the build action for these jars in the properties page to "InputJar". + + +== Reference Jars == + +These are jars that are referenced by the input jar. C# bindings will +not be created for these jars. These jars will be used to resolve +types used by the input jar. + +NOTE: Do not add "android.jar" as a reference jar. It will be added automatically +based on the Target Framework selected. + +Set the build action for these jars in the properties page to "ReferenceJar". \ No newline at end of file diff --git a/src/PCloudBindings/Jars/pcloud-sdk-android-1.0.1.aar b/src/PCloudBindings/Jars/pcloud-sdk-android-1.0.1.aar new file mode 100644 index 0000000000000000000000000000000000000000..29c5015bd6fb7fe483a4354f32eeadd161560fd3 GIT binary patch literal 9486 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 H0O0=tyxPb< literal 0 HcmV?d00001 diff --git a/src/PCloudBindings/Jars/pcloud-sdk-java-core-1.0.1.jar b/src/PCloudBindings/Jars/pcloud-sdk-java-core-1.0.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..96a99ec5d921a5431f6aded3e8a2d8ee5f980075 GIT binary patch literal 83567 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 + + + Debug + AnyCPU + {2DB80C77-D46F-4970-B967-E9FFA9B2AC2E} + {6322E8A7-5C46-4E8C-8B19-448B7BC95DC1};{E1126D83-ADAB-4E4F-81F7-4B0A645A68C7} + Library + Properties + PCloudBindings + PCouldBindings + 512 + True + v8.1 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 0 + None + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + bin\ReleaseNoNet\ + TRACE + true + pdbonly + AnyCPU + prompt + MinimumRecommendedRules.ruleset + false + 4 + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/PCloudBindings/Properties/AssemblyInfo.cs b/src/PCloudBindings/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..b4493d7e --- /dev/null +++ b/src/PCloudBindings/Properties/AssemblyInfo.cs @@ -0,0 +1,30 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using Android.App; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("PCloudBindings")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("PCloudBindings")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: ComVisible(false)] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/src/PCloudBindings/Transforms/EnumFields.xml b/src/PCloudBindings/Transforms/EnumFields.xml new file mode 100644 index 00000000..22959957 --- /dev/null +++ b/src/PCloudBindings/Transforms/EnumFields.xml @@ -0,0 +1,14 @@ + + + \ No newline at end of file diff --git a/src/PCloudBindings/Transforms/EnumMethods.xml b/src/PCloudBindings/Transforms/EnumMethods.xml new file mode 100644 index 00000000..49216c61 --- /dev/null +++ b/src/PCloudBindings/Transforms/EnumMethods.xml @@ -0,0 +1,13 @@ + + + \ No newline at end of file diff --git a/src/PCloudBindings/Transforms/Metadata.xml b/src/PCloudBindings/Transforms/Metadata.xml new file mode 100644 index 00000000..2587ddc4 --- /dev/null +++ b/src/PCloudBindings/Transforms/Metadata.xml @@ -0,0 +1,9 @@ + + + diff --git a/src/java/JavaFileStorage/app/build.gradle b/src/java/JavaFileStorage/app/build.gradle index 602be402..789f4131 100644 --- a/src/java/JavaFileStorage/app/build.gradle +++ b/src/java/JavaFileStorage/app/build.gradle @@ -35,6 +35,8 @@ dependencies { compile('com.onedrive.sdk:onedrive-sdk-android:1.2.0') { transitive = false } + compile 'com.pcloud.sdk:java-core:1.0.1' + compile 'com.pcloud.sdk:android:1.0.1' compile 'com.google.code.gson:gson:2.3.1' compile 'com.microsoft.services.msa:msa-auth:0.8.6' compile 'com.microsoft.aad:adal:1.14.0' diff --git a/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/JavaFileStorage.java b/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/JavaFileStorage.java index 0dca7e9d..49019bfd 100644 --- a/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/JavaFileStorage.java +++ b/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/JavaFileStorage.java @@ -132,7 +132,7 @@ public class FileEntry { public boolean checkForFileChangeFast(String path, String previousFileVersion) throws Exception; - public String getCurrentFileVersionFast(String path); + public String getCurrentFileVersionFast(String path) throws Exception; public InputStream openFileForRead(String path) throws Exception; @@ -157,4 +157,4 @@ public class FileEntry { public void onActivityResult(FileStorageSetupActivity activity, int requestCode, int resultCode, Intent data); public void onRequestPermissionsResult(FileStorageSetupActivity activity, int requestCode, String[] permissions, int[] grantResults); -} \ No newline at end of file +} diff --git a/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/PCloudFileStorage.java b/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/PCloudFileStorage.java new file mode 100644 index 00000000..45e064dc --- /dev/null +++ b/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/PCloudFileStorage.java @@ -0,0 +1,402 @@ +package keepass2android.javafilestorage; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.net.Uri; +import android.os.Bundle; + +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.regex.Pattern; + +import com.pcloud.sdk.ApiClient; +import com.pcloud.sdk.ApiError; +import com.pcloud.sdk.Authenticators; +import com.pcloud.sdk.AuthorizationActivity; +import com.pcloud.sdk.AuthorizationResult; +import com.pcloud.sdk.Call; +import com.pcloud.sdk.DataSource; +import com.pcloud.sdk.PCloudSdk; +import com.pcloud.sdk.RemoteEntry; +import com.pcloud.sdk.RemoteFile; +import com.pcloud.sdk.RemoteFolder; + +/** + * FileStorage implementation for PCloud provider. + * https://www.pcloud.com/ + */ +public class PCloudFileStorage extends JavaFileStorageBase +{ + final static private int PCLOUD_AUTHORIZATION_REQUEST_CODE = 1001845497; + + final static private String SHARED_PREF_NAME = "PCLOUD"; + final static private String SHARED_PREF_AUTH_TOKEN = "AUTH_TOKEN"; + + private final Context ctx; + + private ApiClient apiClient; + private String clientId; + + public PCloudFileStorage(Context ctx, String clientId) { + this.ctx = ctx; + this.clientId = clientId; + this.apiClient = createApiClientFromSharedPrefs(); + } + + @Override + public boolean requiresSetup(String path) { + return true; + } + + @Override + public void startSelectFile(FileStorageSetupInitiatorActivity activity, boolean isForSave, int requestCode) { + String path = getProtocolId() + "://"; + activity.startSelectFileProcess(path, isForSave, requestCode); + } + + @Override + public void prepareFileUsage(Context appContext, String path) throws Throwable { + if (!isConnected()) { + throw new UserInteractionRequiredException(); + } + } + + @Override + public void prepareFileUsage(FileStorageSetupInitiatorActivity activity, String path, int requestCode, boolean alwaysReturnSuccess) { + if (isConnected()) { + Intent intent = new Intent(); + intent.putExtra(EXTRA_PATH, path); + activity.onImmediateResult(requestCode, RESULT_FILEUSAGE_PREPARED, intent); + } else { + activity.startFileUsageProcess(path, requestCode, alwaysReturnSuccess); + } + } + + @Override + public String getProtocolId() { + return "pcloud"; + } + + @Override + public String getDisplayName(String path) { + return path; + } + + @Override + public String getFilename(String path) { + return path.substring(path.lastIndexOf("/") + 1); + } + + @Override + public boolean checkForFileChangeFast(String path, String previousFileVersion) throws Exception { + if (previousFileVersion == null || "".equals(previousFileVersion)) { + return false; + } + + path = this.cleanPath(path); + + RemoteFile remoteFile = this.getRemoteFileByPath(path); + + return !remoteFile.hash().equals(previousFileVersion); + } + + @Override + public String getCurrentFileVersionFast(String path) throws Exception { + path = this.cleanPath(path); + + RemoteFile remoteFile = this.getRemoteFileByPath(path); + + return remoteFile.hash(); + } + + @Override + public InputStream openFileForRead(String path) throws Exception { + path = this.cleanPath(path); + + RemoteFile remoteFile = this.getRemoteFileByPath(path); + + return remoteFile.byteStream(); + } + + @Override + public void uploadFile(String path, byte[] data, boolean writeTransactional) throws Exception { + path = this.cleanPath(path); + + DataSource dataSource = DataSource.create(data); + String filename = path.substring(path.lastIndexOf("/") + 1); + String filePath = path.substring(0, path.lastIndexOf("/") + 1); + RemoteFolder remoteFolder = this.getRemoteFolderByPath(filePath); + + try { + this.apiClient.createFile(remoteFolder, filename, dataSource).execute(); + } catch (ApiError e) { + throw convertApiError(e); + } + } + + @Override + public String createFolder(String parentPath, String newDirName) throws Exception { + String parentPathWithoutProtocol = this.cleanPath(parentPath); + + RemoteFolder remoteFolder = this.getRemoteFolderByPath(parentPathWithoutProtocol); + + try { + this.apiClient.createFolder(remoteFolder, newDirName).execute(); + } catch (ApiError e) { + throw convertApiError(e); + } + + return this.createFilePath(parentPath, newDirName); + } + + @Override + public String createFilePath(String parentPath, String newFileName) throws Exception { + return ( + this.getProtocolId() + "://" + + this.cleanPath(parentPath) + + ("".equals(newFileName) ? "" : "/") + newFileName + ); + } + + @Override + public List listFiles(String parentPath) throws Exception { + parentPath = this.cleanPath(parentPath); + + ArrayList fileEntries = new ArrayList<>(); + + RemoteFolder remoteFolder = this.getRemoteFolderByPath(parentPath); + + for (RemoteEntry remoteEntry : remoteFolder.children()) { + fileEntries.add(this.convertRemoteEntryToFileEntry(remoteEntry, parentPath)); + } + + return fileEntries; + } + + @Override + public FileEntry getFileEntry(String path) throws Exception { + path = this.cleanPath(path); + + RemoteEntry remoteEntry = this.getRemoteEntryByPath(path); + + return this.convertRemoteEntryToFileEntry( + remoteEntry, + path.substring(0, path.lastIndexOf("/")) + ); + } + + @Override + public void delete(String path) throws Exception { + path = this.cleanPath(path); + + RemoteEntry remoteEntry = this.getRemoteFileByPath(path); + + try { + this.apiClient.delete(remoteEntry).execute(); + } catch (ApiError e) { + throw convertApiError(e); + } + } + + @Override + public void onCreate(FileStorageSetupActivity activity, Bundle savedInstanceState) { + + } + + @Override + public void onResume(FileStorageSetupActivity activity) { + if (activity.getProcessName().equals(PROCESS_NAME_SELECTFILE)) { + activity.getState().putString(EXTRA_PATH, activity.getPath()); + } + + if (this.isConnected()) { + finishActivityWithSuccess(activity); + } else if (!activity.getState().getBoolean("hasStartedAuth", false)) { + Activity castedActivity = (Activity)activity; + Intent authIntent = AuthorizationActivity.createIntent(castedActivity, this.clientId); + castedActivity.startActivityForResult(authIntent, PCLOUD_AUTHORIZATION_REQUEST_CODE); + activity.getState().putBoolean("hasStartedAuth", true); + } + + } + + @Override + public void onActivityResult(FileStorageSetupActivity activity, int requestCode, int resultCode, Intent data) { + if (requestCode == PCLOUD_AUTHORIZATION_REQUEST_CODE && data != null) { + activity.getState().putBoolean("hasStartedAuth", false); + AuthorizationResult result = (AuthorizationResult)( + data.getSerializableExtra(AuthorizationActivity.KEY_AUTHORIZATION_RESULT) + ); + this.handleAuthResult(activity, result, data); + } + } + + private void handleAuthResult(FileStorageSetupActivity activity, AuthorizationResult authorizationResult, + Intent data) { + if (authorizationResult == AuthorizationResult.ACCESS_GRANTED) { + String authToken = data.getStringExtra(AuthorizationActivity.KEY_ACCESS_TOKEN); + setAuthToken(authToken); + finishActivityWithSuccess(activity); + } else { + Activity castedActivity = (Activity)activity; + Intent resultData = new Intent(); + resultData.putExtra(EXTRA_ERROR_MESSAGE, "Authentication failed."); + castedActivity.setResult(Activity.RESULT_CANCELED, resultData); + castedActivity.finish(); + } + } + + @Override + public void onStart(FileStorageSetupActivity activity) { + + } + + private ApiClient createApiClientFromSharedPrefs() { + SharedPreferences prefs = this.ctx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE); + String authToken = prefs.getString(SHARED_PREF_AUTH_TOKEN, null); + return this.createApiClient(authToken); + } + + private ApiClient createApiClient(String authToken) { + if (authToken == null) { + return null; + } + + return ( + PCloudSdk.newClientBuilder() + .authenticator(Authenticators.newOAuthAuthenticator(authToken)) + .create() + ); + } + + private boolean isConnected() { + return (this.apiClient != null); + } + + private void clearAuthToken() { + this.apiClient = null; + SharedPreferences prefs = this.ctx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor edit = prefs.edit(); + edit.clear(); + edit.apply(); + } + + private void setAuthToken(String authToken) { + this.apiClient = this.createApiClient(authToken); + SharedPreferences prefs = this.ctx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor edit = prefs.edit(); + edit.putString(SHARED_PREF_AUTH_TOKEN, authToken); + edit.apply(); + } + + private String cleanPath(String path) { + return ( + "/" + path.replaceAll("^(" + Pattern.quote(this.getProtocolId()) + "://)?/*", "") + ); + } + + private RemoteFile getRemoteFileByPath(String path) throws Exception { + RemoteEntry remoteEntry = this.getRemoteEntryByPath(path); + + try { + return remoteEntry.asFile(); + } catch (IllegalStateException e) { + throw new FileNotFoundException(e.toString()); + } + } + + private RemoteFolder getRemoteFolderByPath(String path) throws Exception { + RemoteEntry remoteEntry = this.getRemoteEntryByPath(path); + + try { + return remoteEntry.asFolder(); + } catch (IllegalStateException e) { + throw new FileNotFoundException(e.toString()); + } + } + + private RemoteEntry getRemoteEntryByPath(String path) throws Exception { + Call call = this.apiClient.listFolder(RemoteFolder.ROOT_FOLDER_ID, true); + + RemoteFolder folder; + try { + folder = call.execute(); + } catch (ApiError apiError) { + throw convertApiError(apiError); + } + + if ("/".equals(path)) { + return folder; + } + + String[] fileNames = path.substring(1).split("/"); + RemoteFolder currentFolder = folder; + Iterator fileNamesIterator = Arrays.asList(fileNames).iterator(); + while (true) { + String fileName = fileNamesIterator.next(); + + Iterator entryIterator = currentFolder.children().iterator(); + while (true) { + RemoteEntry remoteEntry; + try { + remoteEntry = entryIterator.next(); + } catch (NoSuchElementException e) { + throw new FileNotFoundException(e.toString()); + } + + if (currentFolder.folderId() == remoteEntry.parentFolderId() && fileName.equals(remoteEntry.name())) { + if (!fileNamesIterator.hasNext()) { + return remoteEntry; + } + + try { + currentFolder = remoteEntry.asFolder(); + } catch (IllegalStateException e) { + throw new FileNotFoundException(e.toString()); + } + + break; + } + } + } + } + + private Exception convertApiError(ApiError e) { + String strErrorCode = String.valueOf(e.errorCode()); + if (strErrorCode.startsWith("1") || "2000".equals(strErrorCode)) { + this.clearAuthToken(); + return new UserInteractionRequiredException("Unlinked from PCloud! User must re-link.", e); + } else if (strErrorCode.startsWith("2")) { + return new FileNotFoundException(e.toString()); + } + + return e; + } + + private FileEntry convertRemoteEntryToFileEntry(RemoteEntry remoteEntry, String parentPath) { + FileEntry fileEntry = new FileEntry(); + fileEntry.canRead = true; + fileEntry.canWrite = true; + fileEntry.path = ( + this.getProtocolId() + "://" + + ("/".equals(parentPath) ? "" : parentPath) + + "/" + remoteEntry.name() + ); + fileEntry.displayName = remoteEntry.name(); + fileEntry.isDirectory = !remoteEntry.isFile(); + fileEntry.lastModifiedTime = remoteEntry.lastModified().getTime(); + + if (remoteEntry.isFile()) { + fileEntry.sizeInBytes = remoteEntry.asFile().size(); + } + + return fileEntry; + } +} diff --git a/src/keepass2android/Resources/drawable-mdpi/ic_storage_pcloud.png b/src/keepass2android/Resources/drawable-mdpi/ic_storage_pcloud.png new file mode 100644 index 0000000000000000000000000000000000000000..816e99400afb7173eb2c1737a9261cbdda3e2169 GIT binary patch literal 861 zcmV-j1ETziP)Vpr33Rb90LJMd{K2$_6XNJpd{{I1Dp~)r!?fgZ#pp0#lR6oe@9>Y zV?^v|T*m~wj$>=<+oBhapm%#_o)r;0douGgT-(8czi=Gh!p-d@%*>&@IT~|XQ9gk; zu)U>oS5?Z-xVX2X>x5p+$I}f5+Bq;1_T!am&+ULFRrQ^OJ9?|!ZtUX3QcTCoxCe7G zb0(&Bky(a6arX!TH8H!l>bBe9n1W}j#~)QCxvmTU<9M-3aN;OQ+<*AmwQF|_3=GVz zy6=Q(mDTrRbJg{v7SAU&2j0PI%pSuqd~awPF06a&hDFsFTk%YM(D=*gh9B@{qv@Q8Yl@B)&qu_P_AolVCg6g)??Zw8SP>D+yN%;MT#9oK nvhhKzkBHyKf5*o$jv@R5v1!s(M{N^e00000NkvXXu0mjfYcZ1c literal 0 HcmV?d00001 diff --git a/src/keepass2android/Resources/drawable-xhdpi/ic_storage_pcloud.png b/src/keepass2android/Resources/drawable-xhdpi/ic_storage_pcloud.png new file mode 100644 index 0000000000000000000000000000000000000000..ff67d750d1de133398f1d00c15809980fed8e2ec GIT binary patch literal 2041 zcmV7FcD466A-prljJpP)o^l9oS58LI}!IXWX*U%q;qnjg8qv z(zDbb3Tm1CBF)*t(Kf+CO(QG@wn+;ymC7u~(GY*Y^25d3ANRS<>+ziX^W0eId}r>= zx%a&9^S=8%&-1?D=XuXUh71`pWXO;qLxv0)GNg{&o}Pf2O#lu7js*7ipZkH0z;lxR z_J2i?nT-WL473C91zO5l%B|&D^0xSVORzdTfz*E2u|9&tquEP2K1h`bvOM4ALW_BX592lR_ z z*NdVLm@DZQ1C}5&n+g0Z*sep5`IMx)6Lz(uJfubdyMV30qrjt*`XcR{fiD7I0tQ9Q z^*c#-4mg6$>@;8%&=k4V4RlI+HE25?=mh2gZ6(aU?qPTbaJ!`KfsJEjS3veB9gQOj9Zv=1`Fg4Ql-@plyp4sCBb#-;+ z^7;IIG5Y3mNlOB9E&^@P#sDYzLi&5xEk!&Gyid|@Z~I-~ z;s&URUBHZ@P;^PK7I%Y^z`iI31V^ygQ-I1pSqCgOvpK*IVg%@sz^8$4O4@B^U6HX5 z_PNGk9x%qtI+92lRDzsuxFU`t=Vf3*d&<_j~^%fa4puFyG=EL=+c2Si0#AjoFcAR8ve>^{4JRg%6J@uGe+>xq#L$D7$`Nzc0Uh@!d7G^U$bi=>xh zJ;;;5TPoc84~u*cMcT~3&bBdF=8Hm=h$Ca7GesP{3hS=wU zu~mq)5Kjiz6H*ST)`S9E9L5CKFGTL`s9>xKu_5N(b7d8i9u*S~MNCYInBBmg{)yrp z34JD&*bLrY%Or|x&>Y_hD#hS5T|`oEm1$2$i7-h*Qw4VaniOKQQ~Z0kG;jyQ%%+vl zSkG5TRvh|)KO_fHcuq7?C>gUPs@PI zT%z=t*#Y4qod!XZ&1|Hk7l8XbUm8*c36p`i1HhIF7gvB4#Tryh8dM7FJ>fmvzn|(Q znyZQ)ltx`T2YkSHq*r2cp>o(Ccw5Y;sR|o61=lkw?DM#fGbQr-d^2k+64aMcG;{{n ziz3>n(O4_#A@{~Hz}Xe_+2)=zHbMSeQ6%W8lqNaV%uaPLdXhqczEWk}Qs>y0Rai-= zCO4Z~B*02L=Y6$F0EtC>s)AJX5;F#6=I~B9i4N-8+l`yvL0L@ zX_?!7muJ?)B5gJRH+vY)ruJ82eho~Q^qP;?1DuoM1D{=cK%nZnxpE5ZBtwn-vOVQ{sV1=0tcam09c#~{Xieq#G9g?;>IqksL8nF2H z=YqB10pN@jjjy3_M&9T4hf_ESxv&nKF9M$}hOpb6N}+-{qyYq-77|qIn5I^20M3#0 z_h6h8D7>99tBQnjGljzXx5A2_nVkpxxJtcLDP9K-%taJ!BThkI0xpr%9T{u1uTN)s zF4q>6QMR~{WNq*MNfY0EZXilmK{N>p8yE+_d+d|$*aV3wqN!g^3FB>ltn z%e5&cv;!G00%wQhP-&^dU!7av8fMr&NX~5qpU|^$b)0H;kY)-e3e&y%Hih+H*cb61 X;uBb2tl@?R00000NkvXXu0mjfTG6&# literal 0 HcmV?d00001 diff --git a/src/keepass2android/Resources/values/strings.xml b/src/keepass2android/Resources/values/strings.xml index 986cb092..50293d90 100644 --- a/src/keepass2android/Resources/values/strings.xml +++ b/src/keepass2android/Resources/values/strings.xml @@ -528,6 +528,7 @@ Dropbox (KP2A folder) If you do not want to give KP2A access to your full Dropbox, you may select this option. It will request only access to the folder Apps/Keepass2Android. This is especially suited when creating a new database. If you already have a database, click this option to create the folder, then place your file inside the folder (from your PC) and then select this option again for opening the file. Google Drive + PCloud OneDrive SFTP (SSH File Transfer) System file picker diff --git a/src/keepass2android/app/App.cs b/src/keepass2android/app/App.cs index f7448d20..16c05191 100644 --- a/src/keepass2android/app/App.cs +++ b/src/keepass2android/app/App.cs @@ -45,6 +45,7 @@ using KeePassLib.Utility; #if !NoNet using Keepass2android.Javafilestorage; using GoogleDriveFileStorage = keepass2android.Io.GoogleDriveFileStorage; +using PCloudFileStorage = keepass2android.Io.PCloudFileStorage; #endif namespace keepass2android { @@ -588,6 +589,7 @@ namespace keepass2android new SftpFileStorage(this), new NetFtpFileStorage(Application.Context, this), new WebDavFileStorage(this), + new PCloudFileStorage(Application.Context, this), //new LegacyWebDavStorage(this), //new LegacyFtpStorage(this), #endif diff --git a/src/keepass2android/keepass2android.csproj b/src/keepass2android/keepass2android.csproj index 4202a813..0f6672ba 100644 --- a/src/keepass2android/keepass2android.csproj +++ b/src/keepass2android/keepass2android.csproj @@ -488,6 +488,7 @@ + @@ -831,6 +832,10 @@ {48574278-4779-4B3A-A9E4-9CF1BC285D0B} JavaFileStorageBindings + + {2DB80C77-D46F-4970-B967-E9FFA9B2AC2E} + PCloudBindings + {545B4A6B-8BBA-4FBE-92FC-4AC060122A54} KeePassLib2Android @@ -1146,6 +1151,9 @@ + + + @@ -1909,4 +1917,4 @@ - \ No newline at end of file +