Compare commits

...

23 Commits

Author SHA1 Message Date
PhilippC
830494851d Merge pull request #2734 from anttiharju/prevent-duplicate-CI-runs
Prevent duplicate CI runs in PRs
2024-12-31 11:34:24 +01:00
anttiharju
6e30dd35ee Prevent duplicate runs in PRs 2024-12-20 08:11:26 +02:00
Philipp Crocoll
dad9b0e53f update minSdk of offline version to 21 (Android 5.0) to simplify the build. 2024-10-22 15:49:08 +02:00
Philipp Crocoll
b2b0b8ddc9 switch to Java 17 in build.yml 2024-10-22 15:23:27 +02:00
Philipp Crocoll
9494f28acf Merge branch 'anttiharju/master' into update-libs-and-tools 2024-10-22 15:11:36 +02:00
Philipp Crocoll
a98cd33cff updating OkHttp, okhttp-digest and dropbox sdk. Removing no longer needed onedrive aar.
I wasn't successful in binding the latest dropbox sdk (7.0) and therefor only updated to 5.4.6 which doesn't require an .aar.
2024-10-22 15:02:10 +02:00
anttiharju
65092dcccf Switch okhttp-digest source to github
as instructed at
https://github.com/rburgst/okhttp-digest?tab=readme-ov-file#use-via-gradle
2024-10-15 22:55:48 +03:00
anttiharju
e464c59796 Downgrade setup-gradle to v3
v3 is node20 and doesn't do validation by default like v4

validation can be disabled in v4 but when that bump is made it's
probably better to resolve the issues rather than ignore them.
2024-10-15 22:48:50 +03:00
anttiharju
7dcccf1105 Bump artifact actions to v4
v4 included breaking changes, but the setup here was compatible
thanks to the usage of `${{ github.job }}`.
https://github.com/actions/upload-artifact/releases/tag/v4.0.0

v3 artifact actions will be deprecated on November 30th
https://github.blog/changelog/2024-04-16-deprecation-notice-v3-of-the-artifact-actions/

node16 actions will be EOL on October 15th
https://github.blog/changelog/2024-09-25-end-of-life-for-actions-node16/

These seem contradictory but I _guess_ on self-hosted runners one
can keep using v3 artifact actions until November 30th.
2024-10-13 15:29:45 +03:00
anttiharju
8d354bb3f0 Update actions/setup-java to v4
Just a node20 update
https://github.com/actions/setup-java/releases/tag/v4.0.0
2024-10-13 15:22:50 +03:00
anttiharju
5882263ee8 Bump microsoft/setup-msbuild to v2 for node20
Just a node20 update
https://github.com/microsoft/setup-msbuild/releases/tag/v2
2024-10-13 15:20:33 +03:00
anttiharju
38e305bb4a Pin a third-party action
This is security hardening, see
https://docs.github.com/en/actions/security-for-github-actions/security-guides/security-hardening-for-github-actions#using-third-party-actions
2024-10-13 15:16:37 +03:00
anttiharju
177b1fc9a3 Update al-cheb/configure-pagefile-action to v1.4
Just a node20 update per
https://github.com/al-cheb/configure-pagefile-action/releases/tag/v1.4
2024-10-13 15:15:11 +03:00
anttiharju
8bde5ed262 Use actions/checkout for fetching submodules 2024-10-13 15:10:36 +03:00
anttiharju
247b37262d Bump actions/cache to v4
Just a node20 update per
https://github.com/actions/cache/releases/tag/v4.0.0
2024-10-13 14:58:18 +03:00
anttiharju
84230b32ef Bump gradle/actions/setup-gradle to v4
It includes caching improvements as described here:
https://github.com/gradle/actions/releases/tag/v4.0.0

windows-2022 includes node20 per
https://github.com/actions/runner-images/blob/main/images/windows/Windows2022-Readme.md#nodejs
2024-10-13 14:56:14 +03:00
anttiharju
a54444e919 Bump gradle-build-action to v3
Gradle v2 uses node16 which will be EOL soon.

"The only major breaking change from gradle-build-action@v2.12.0
is the update to require a Node 20 runtime environment.

Aside from that change, this release should generally serve as a
drop-in replacement for gradle-build-action@v2."

Gradle updated the action name, following the advice from
https://github.com/gradle/gradle-build-action/releases/tag/v3.0.0
2024-10-13 14:42:06 +03:00
anttiharju
4b55e2ce8b Bump checkout from v3 to v4
checkout v3 uses node16 which reaches EOL on 15th of Oct 2024
https://github.blog/changelog/2024-09-25-end-of-life-for-actions-node16/
2024-10-13 14:35:35 +03:00
Philipp Crocoll
5ae718c58e update targetframework for Guava libs 2024-10-08 16:19:24 +02:00
Philipp Crocoll
669022ddf0 update Newtonsoft.Json, FluentFTP and MegaApiClient to the latest versions 2024-10-08 16:07:56 +02:00
Philipp Crocoll
f0fd21a6ec upgrade to Gradle version 8.6 (plugin version 8.4) 2024-10-08 16:03:03 +02:00
Philipp Crocoll
73a8ec27d4 remove no-longer-needed jars from JavaFileStorageBindings 2024-10-08 15:19:23 +02:00
Philipp Crocoll
51902c9bc4 fix build issues related to removal of deprecated OneDrive API jars. onedrive:// is now no longer supported, but has been replaced with onedrive2:// a long time ago already. 2024-10-08 14:59:49 +02:00
57 changed files with 282 additions and 1208 deletions

View File

@@ -1,6 +1,10 @@
name: Build keepass2android app
on: [push, pull_request]
on:
push:
branches:
- main
pull_request:
jobs:
# macos:
@@ -10,16 +14,15 @@ jobs:
# runs-on: macos-12
# steps:
# - uses: actions/checkout@v3
# - name: Fetch submodules
# run: git submodule init && git submodule update
# - uses: actions/checkout@v4
# with:
# submodules: true
# - name: Setup Gradle
# uses: gradle/gradle-build-action@v2
# uses: gradle/actions/setup-gradle@v3
# - name: Cache NuGet packages
# uses: actions/cache@v3
# uses: actions/cache@v4
# with:
# path: ~/.nuget/packages
# key: ${{ runner.os }}-nuget-${{ hashFiles('src/**/*.csproj', 'src/**/packages.config') }}
@@ -52,7 +55,7 @@ jobs:
# # $VM_ASSETS/select-xamarin-sdk-v2.sh --mono=6.12 --android=11.2
# - name: Switch to JDK-11
# uses: actions/setup-java@v3
# uses: actions/setup-java@v4
# with:
# java-version: '11'
# distribution: 'temurin'
@@ -82,7 +85,7 @@ jobs:
# make apk Flavor=Net
# - name: Archive production artifacts (net)
# uses: actions/upload-artifact@v3
# uses: actions/upload-artifact@v4
# with:
# name: signed APK ('net' built on ${{ github.job }})
# path: |
@@ -100,7 +103,7 @@ jobs:
# make apk Flavor=NoNet
# - name: Archive production artifacts (nonet)
# uses: actions/upload-artifact@v3
# uses: actions/upload-artifact@v4
# with:
# name: signed APK ('nonet' built on ${{ github.job }})
# path: |
@@ -130,16 +133,15 @@ jobs:
# # Build Artifact of xamarin.android-oss dated 2022-02-16, master branch (= version 12.2.99)
# xamarin_url: https://artprodcus3.artifacts.visualstudio.com/Ad0adf05a-e7d7-4b65-96fe-3f3884d42038/6fd3d886-57a5-4e31-8db7-52a1b47c07a8/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL3hhbWFyaW4vcHJvamVjdElkLzZmZDNkODg2LTU3YTUtNGUzMS04ZGI3LTUyYTFiNDdjMDdhOC9idWlsZElkLzU0OTUzL2FydGlmYWN0TmFtZS9pbnN0YWxsZXJzLXVuc2lnbmVkKy0rTGludXg1/content?format=zip
# steps:
# - uses: actions/checkout@v3
# - name: Fetch submodules
# run: git submodule init && git submodule update
# - uses: actions/checkout@v4
# with:
# submodules: true
# - name: Setup Gradle
# uses: gradle/gradle-build-action@v2
# uses: gradle/actions/setup-gradle@v3
# - name: Cache NuGet packages
# uses: actions/cache@v3
# uses: actions/cache@v4
# with:
# path: ~/.nuget/packages
# key: ${{ runner.os }}-nuget-${{ hashFiles('src/**/*.csproj', 'src/**/packages.config') }}
@@ -148,7 +150,7 @@ jobs:
# - name: Cache Xamarin.Android packages
# id: xamarin_cache
# uses: actions/cache@v3
# uses: actions/cache@v4
# with:
# path: ~/xamarin.android-oss
# key: ${{ runner.os }}-xamarin.android-oss-${{ env.xamarin_url }}
@@ -183,7 +185,7 @@ jobs:
# echo "$HOME/xamarin.android-oss/bin/Release/bin" >> $GITHUB_PATH
# - name: Switch to JDK-11
# uses: actions/setup-java@v3
# uses: actions/setup-java@v4
# with:
# java-version: '11'
# distribution: 'temurin'
@@ -217,7 +219,7 @@ jobs:
# make apk Flavor=Net
# - name: Archive production artifacts (net)
# uses: actions/upload-artifact@v3
# uses: actions/upload-artifact@v4
# with:
# name: signed APK ('net' built on ${{ github.job }})
# path: |
@@ -235,7 +237,7 @@ jobs:
# make apk Flavor=NoNet
# - name: Archive production artifacts (nonet)
# uses: actions/upload-artifact@v3
# uses: actions/upload-artifact@v4
# with:
# name: signed APK ('nonet' built on ${{ github.job }})
# path: |
@@ -254,39 +256,38 @@ jobs:
runs-on: windows-2022
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
submodules: true
- name: Setup Gradle
uses: gradle/gradle-build-action@v2
uses: gradle/actions/setup-gradle@v3
- name: Cache NuGet packages
uses: actions/cache@v3
uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('src/**/*.csproj', 'src/**/packages.config') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: Fetch submodules
run: git submodule init && git submodule update
# Workaround an issue when building on windows-2022. Error was
# D8 : OpenJDK 64-Bit Server VM warning : INFO: os::commit_memory(0x00000000ae400000, 330301440, 0) failed; error='The paging file is too small for this operation to complete' (DOS error/errno=1455) [D:\a\keepass2android\keepass2android\src\keepass2android\keepass2android-app.csproj]
# C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Xamarin\Android\Xamarin.Android.D8.targets(81,5): error MSB6006: "java.exe" exited with code 1. [D:\a\keepass2android\keepass2android\src\keepass2android\keepass2android-app.csproj]
- name: Configure Pagefile
uses: al-cheb/configure-pagefile-action@v1.3
uses: al-cheb/configure-pagefile-action@a3b6ebd6b634da88790d9c58d4b37a7f4a7b8708 # v1.4
with:
minimum-size: 8GB
- name: Add msbuild to PATH
uses: microsoft/setup-msbuild@v1.1
uses: microsoft/setup-msbuild@v2
# If we want to also have nmake, use this instead
#uses: ilammy/msvc-dev-cmd@v1
- name: Switch to JDK-11
uses: actions/setup-java@v3
- name: Switch to JDK-17
uses: actions/setup-java@v4
with:
java-version: '11'
java-version: '17'
distribution: 'temurin'
- name: Display java version
@@ -320,7 +321,7 @@ jobs:
make apk Flavor=Net
- name: Archive production artifacts (net)
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: signed APK ('net' built on ${{ github.job }})
path: |
@@ -341,7 +342,7 @@ jobs:
make apk Flavor=NoNet
- name: Archive production artifacts (nonet)
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: signed APK ('nonet' built on ${{ github.job }})
path: |

1
.gitignore vendored
View File

@@ -176,3 +176,4 @@ src/java/Keepass2AndroidPluginSDK2/build/generated/mockable-Google-Inc.-Google-A
/src/ActionViewFilterTest
/docs/gdrive-verification
/src/MegaTest
*.dtbcache.json

View File

@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.microsoft.services.msa"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="22" />
<uses-permission android:name="com.sony.mobile.permission.SYSTEM_UI_VISIBILITY_EXTENSION" />
</manifest>

View File

@@ -1 +0,0 @@
int string app_name 0x7f020000

View File

@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.microsoft.services.msa"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="22" />
<uses-permission android:name="com.sony.mobile.permission.SYSTEM_UI_VISIBILITY_EXTENSION" />
</manifest>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- From: file:/C:/Users/pnied/Documents/git/msa-auth-for-android/src/main/res/values/strings.xml -->
<eat-comment/>
<string name="app_name">msa-auth</string>
</resources>

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.microsoft.onedrivesdk"
android:versionCode="10202"
android:versionName="1.2.2" >
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="23" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
</manifest>

View File

@@ -1,22 +0,0 @@
int dimen activity_horizontal_margin 0x7f030000
int dimen activity_vertical_margin 0x7f030001
int id LinearLayout1 0x7f060004
int id com_microsoft_aad_adal_editDummyText 0x7f060002
int id com_microsoft_aad_adal_progressBar 0x7f060003
int id com_microsoft_aad_adal_webView1 0x7f060001
int id editPassword 0x7f060006
int id editUserName 0x7f060005
int id webView1 0x7f060000
int layout activity_authentication 0x7f020000
int layout dialog_authentication 0x7f020001
int layout http_auth_dialog 0x7f020002
int string app_loading 0x7f050000
int string app_name 0x7f050001
int string broker_processing 0x7f050002
int string http_auth_dialog_cancel 0x7f050003
int string http_auth_dialog_login 0x7f050004
int string http_auth_dialog_password 0x7f050005
int string http_auth_dialog_title 0x7f050006
int string http_auth_dialog_username 0x7f050007
int style AppBaseTheme 0x7f040000
int style AppTheme 0x7f040001

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.microsoft.onedrivesdk"
android:versionCode="10202"
android:versionName="1.2.2" >
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="23" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
</manifest>

View File

@@ -183,6 +183,7 @@
<LibraryProjectZip Include="..\java\JavaFileStorage\app\build\outputs\aar\JavaFileStorage-debug.aar">
<Link>Jars\JavaFileStorage-debug.aar</Link>
</LibraryProjectZip>
<None Include="app.config" />
<None Include="Jars\AboutJars.txt" />
<None Include="Additions\AboutAdditions.txt" />
<None Include="packages.config" />
@@ -212,12 +213,6 @@
<Name>PCloudBindings</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\msa-auth-0.8.6\classes-msa-auth.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\onedrive-sdk-android-1.2.2\classes-onedrive-sdk.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\gdrive\commons-logging-1.1.1.jar" />
</ItemGroup>
@@ -242,21 +237,6 @@
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\gdrive\google-http-client-gson-1.16.0-rc.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\jackson-core-2.7.4.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\okhttp-digest-2.5.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\okio-2.9.0.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\okhttp-4.10.0-RC1.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedJar Include="Jars\dropbox-core-sdk-4.0.0.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\gson-2.8.6.jar" />
</ItemGroup>
@@ -290,18 +270,30 @@
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\gdrive\opencensus-api-0.24.0.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\okhttp-4.12.0.jar" />
<EmbeddedReferenceJar Include="Jars\okio-3.6.0.jar" />
<EmbeddedReferenceJar Include="Jars\okio-jvm-3.6.0.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\okhttp-digest-3.1.0.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\dropbox-core-sdk-5.4.6.jar" />
<EmbeddedReferenceJar Include="Jars\jackson-core-2.13.5.jar" />
</ItemGroup>
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Verwenden Sie die Wiederherstellung von NuGet-Paketen, um die fehlenden Dateien herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}".</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Migration.1.0.10\build\monoandroid120\Xamarin.AndroidX.Migration.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Migration.1.0.10\build\monoandroid120\Xamarin.AndroidX.Migration.props'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Migration.1.0.10\build\monoandroid120\Xamarin.AndroidX.Migration.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Migration.1.0.10\build\monoandroid120\Xamarin.AndroidX.Migration.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Build.Download.0.11.4\build\Xamarin.Build.Download.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Build.Download.0.11.4\build\Xamarin.Build.Download.props'))" />
<Error Condition="!Exists('..\packages\Xamarin.Build.Download.0.11.4\build\Xamarin.Build.Download.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Build.Download.0.11.4\build\Xamarin.Build.Download.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Google.Guava.ListenableFuture.1.0.0.9\build\monoandroid12.0\Xamarin.Google.Guava.ListenableFuture.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Google.Guava.ListenableFuture.1.0.0.9\build\monoandroid12.0\Xamarin.Google.Guava.ListenableFuture.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Jetbrains.Annotations.23.0.0.4\build\monoandroid12.0\Xamarin.Jetbrains.Annotations.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Jetbrains.Annotations.23.0.0.4\build\monoandroid12.0\Xamarin.Jetbrains.Annotations.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Kotlin.StdLib.Common.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Common.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Kotlin.StdLib.Common.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Common.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Kotlin.StdLib.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Kotlin.StdLib.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.targets'))" />
@@ -326,7 +318,6 @@
<Error Condition="!Exists('..\packages\Xamarin.Kotlin.StdLib.Jdk7.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk7.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Kotlin.StdLib.Jdk7.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk7.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Kotlin.StdLib.Jdk8.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk8.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Kotlin.StdLib.Jdk8.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk8.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.KotlinX.Coroutines.Core.Jvm.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Core.Jvm.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.KotlinX.Coroutines.Core.Jvm.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Core.Jvm.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.2.5.1\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.2.5.1\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Activity.1.6.0\build\monoandroid12.0\Xamarin.AndroidX.Activity.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Activity.1.6.0\build\monoandroid12.0\Xamarin.AndroidX.Activity.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Fragment.1.5.3\build\monoandroid12.0\Xamarin.AndroidX.Fragment.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Fragment.1.5.3\build\monoandroid12.0\Xamarin.AndroidX.Fragment.targets'))" />
@@ -337,13 +328,14 @@
<Error Condition="!Exists('..\packages\Xamarin.GooglePlayServices.Auth.Base.118.0.6\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.Base.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.GooglePlayServices.Auth.Base.118.0.6\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.Base.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.GooglePlayServices.Fido.119.0.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Fido.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.GooglePlayServices.Fido.119.0.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Fido.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.GooglePlayServices.Auth.120.4.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.GooglePlayServices.Auth.120.4.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets'))" />
</Target>
<Import Project="..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets" Condition="Exists('..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets')" />
<Import Project="..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets" Condition="Exists('..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets" Condition="Exists('..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Migration.1.0.10\build\monoandroid120\Xamarin.AndroidX.Migration.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Migration.1.0.10\build\monoandroid120\Xamarin.AndroidX.Migration.targets')" />
<Import Project="..\packages\Xamarin.Build.Download.0.11.4\build\Xamarin.Build.Download.targets" Condition="Exists('..\packages\Xamarin.Build.Download.0.11.4\build\Xamarin.Build.Download.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets" Condition="Exists('..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets')" />
<Import Project="..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets" Condition="Exists('..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets')" />
<Import Project="..\packages\Xamarin.Google.Guava.ListenableFuture.1.0.0.9\build\monoandroid12.0\Xamarin.Google.Guava.ListenableFuture.targets" Condition="Exists('..\packages\Xamarin.Google.Guava.ListenableFuture.1.0.0.9\build\monoandroid12.0\Xamarin.Google.Guava.ListenableFuture.targets')" />
<Import Project="..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets" Condition="Exists('..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets')" />
<Import Project="..\packages\Xamarin.Jetbrains.Annotations.23.0.0.4\build\monoandroid12.0\Xamarin.Jetbrains.Annotations.targets" Condition="Exists('..\packages\Xamarin.Jetbrains.Annotations.23.0.0.4\build\monoandroid12.0\Xamarin.Jetbrains.Annotations.targets')" />
<Import Project="..\packages\Xamarin.Kotlin.StdLib.Common.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Common.targets" Condition="Exists('..\packages\Xamarin.Kotlin.StdLib.Common.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Common.targets')" />
<Import Project="..\packages\Xamarin.Kotlin.StdLib.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.targets" Condition="Exists('..\packages\Xamarin.Kotlin.StdLib.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.targets')" />
@@ -368,7 +360,6 @@
<Import Project="..\packages\Xamarin.Kotlin.StdLib.Jdk7.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk7.targets" Condition="Exists('..\packages\Xamarin.Kotlin.StdLib.Jdk7.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk7.targets')" />
<Import Project="..\packages\Xamarin.Kotlin.StdLib.Jdk8.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk8.targets" Condition="Exists('..\packages\Xamarin.Kotlin.StdLib.Jdk8.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk8.targets')" />
<Import Project="..\packages\Xamarin.KotlinX.Coroutines.Core.Jvm.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Core.Jvm.targets" Condition="Exists('..\packages\Xamarin.KotlinX.Coroutines.Core.Jvm.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Core.Jvm.targets')" />
<Import Project="..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets" Condition="Exists('..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.2.5.1\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.2.5.1\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Activity.1.6.0\build\monoandroid12.0\Xamarin.AndroidX.Activity.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Activity.1.6.0\build\monoandroid12.0\Xamarin.AndroidX.Activity.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Fragment.1.5.3\build\monoandroid12.0\Xamarin.AndroidX.Fragment.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Fragment.1.5.3\build\monoandroid12.0\Xamarin.AndroidX.Fragment.targets')" />
@@ -379,4 +370,5 @@
<Import Project="..\packages\Xamarin.GooglePlayServices.Auth.Base.118.0.6\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.Base.targets" Condition="Exists('..\packages\Xamarin.GooglePlayServices.Auth.Base.118.0.6\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.Base.targets')" />
<Import Project="..\packages\Xamarin.GooglePlayServices.Fido.119.0.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Fido.targets" Condition="Exists('..\packages\Xamarin.GooglePlayServices.Fido.119.0.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Fido.targets')" />
<Import Project="..\packages\Xamarin.GooglePlayServices.Auth.120.4.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.targets" Condition="Exists('..\packages\Xamarin.GooglePlayServices.Auth.120.4.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.targets')" />
<Import Project="..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets" Condition="Exists('..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets')" />
</Project>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Google.Apis.Auth" publicKeyToken="4b01fa6e34db77ab" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.67.0.0" newVersion="1.67.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@@ -24,8 +24,8 @@
<package id="Xamarin.AndroidX.VersionedParcelable" version="1.1.1.14" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.ViewPager" version="1.0.0.14" targetFramework="monoandroid13.0" />
<package id="Xamarin.Build.Download" version="0.11.4" targetFramework="monoandroid13.0" />
<package id="Xamarin.Google.Guava" version="28.2.0.1" targetFramework="monoandroid90" />
<package id="Xamarin.Google.Guava.FailureAccess" version="1.0.1.3" targetFramework="monoandroid90" />
<package id="Xamarin.Google.Guava" version="28.2.0.1" targetFramework="monoandroid13.0" />
<package id="Xamarin.Google.Guava.FailureAccess" version="1.0.1.3" targetFramework="monoandroid13.0" />
<package id="Xamarin.Google.Guava.ListenableFuture" version="1.0.0.9" targetFramework="monoandroid13.0" />
<package id="Xamarin.GooglePlayServices.Auth" version="120.4.0" targetFramework="monoandroid13.0" />
<package id="Xamarin.GooglePlayServices.Auth.Api.Phone" version="118.0.1.2" targetFramework="monoandroid13.0" />

View File

@@ -27,7 +27,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "keepass2android-app", "keep
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kp2aAutofillParser", "Kp2aAutofillParser\Kp2aAutofillParser.csproj", "{39B12571-BAFE-4D3A-AEE2-4D74F14DFD96}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kp2aAutofillParserTest", "Kp2aAutofillParserTest\Kp2aAutofillParserTest.csproj", "{3D1560FF-86BB-4CB4-8367-80BA13B81C38}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kp2aAutofillParserTest", "Kp2aAutofillParserTest\Kp2aAutofillParserTest.csproj", "{3D1560FF-86BB-4CB4-8367-80BA13B81C38}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution

View File

@@ -6,7 +6,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
</Project>

View File

@@ -20,13 +20,13 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="3.1.2">
<PackageReference Include="coverlet.collector" Version="6.0.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>

View File

@@ -1,31 +1,23 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using KeePassLib.Serialization;
#if !EXCLUDE_JAVAFILESTORAGE
using Keepass2android.Javafilestorage;
using Exception = Java.Lang.Exception;
namespace keepass2android.Io
{
public class OneDriveFileStorage: JavaFileStorage
/// <summary>
/// This IFileStorage implementation becomes picked if a user is using a skydrive:// or onedrive:// file.
/// These refer to an old (Java) implementation which was replaced starting in 2019. The successor uses onedrive2:// (see OneDrive2FileStorage)
/// The Java implementation was removed in 2024 when the jar files became unavailable. We are keeping this file to notify any user who haven't updated their
/// file storage within 5 years.
/// This file should be removed around mid 2025.
/// </summary>
public class OneDriveFileStorage: IFileStorage
{
private const string ClientId = "000000004010C234";
public OneDriveFileStorage(Context ctx, IKp2aApp app) :
base(new Keepass2android.Javafilestorage.OneDriveStorage(ctx, ClientId), app)
{
}
public override IEnumerable<string> SupportedProtocols
public IEnumerable<string> SupportedProtocols
{
get
{
@@ -34,10 +26,146 @@ namespace keepass2android.Io
}
}
public override bool UserShouldBackup
private Exception GetDeprecatedMessage()
{
return new Exception(
"You have opened your file through a deprecated Microsoft API. Please select Change database, Open Database and then select One Drive again.");
}
public bool UserShouldBackup
{
get { return false; }
}
}
public void Delete(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public bool CheckForFileChangeFast(IOConnectionInfo ioc, string previousFileVersion)
{
throw GetDeprecatedMessage();
}
public string GetCurrentFileVersionFast(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public Stream OpenFileForRead(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public IWriteTransaction OpenWriteTransaction(IOConnectionInfo ioc, bool useFileTransaction)
{
throw GetDeprecatedMessage();
}
public string GetFilenameWithoutPathAndExt(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public string GetFileExtension(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public bool RequiresCredentials(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public void CreateDirectory(IOConnectionInfo ioc, string newDirName)
{
throw GetDeprecatedMessage();
}
public IEnumerable<FileDescription> ListContents(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public FileDescription GetFileDescription(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public bool RequiresSetup(IOConnectionInfo ioConnection)
{
throw GetDeprecatedMessage();
}
public string IocToPath(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public void StartSelectFile(IFileStorageSetupInitiatorActivity activity, bool isForSave, int requestCode, string protocolId)
{
throw GetDeprecatedMessage();
}
public void PrepareFileUsage(IFileStorageSetupInitiatorActivity activity, IOConnectionInfo ioc, int requestCode,
bool alwaysReturnSuccess)
{
throw GetDeprecatedMessage();
}
public void PrepareFileUsage(Context ctx, IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public void OnCreate(IFileStorageSetupActivity activity, Bundle savedInstanceState)
{
throw GetDeprecatedMessage();
}
public void OnResume(IFileStorageSetupActivity activity)
{
throw GetDeprecatedMessage();
}
public void OnStart(IFileStorageSetupActivity activity)
{
throw GetDeprecatedMessage();
}
public void OnActivityResult(IFileStorageSetupActivity activity, int requestCode, int resultCode, Intent data)
{
throw GetDeprecatedMessage();
}
public string GetDisplayName(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public string CreateFilePath(string parent, string newFilename)
{
throw GetDeprecatedMessage();
}
public IOConnectionInfo GetParentPath(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public IOConnectionInfo GetFilePath(IOConnectionInfo folderPath, string filename)
{
throw GetDeprecatedMessage();
}
public bool IsPermanentLocation(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public bool IsReadOnly(IOConnectionInfo ioc, OptionalOut<UiStringKey> reason = null)
{
throw GetDeprecatedMessage();
}
}
}
#endif

View File

@@ -1,9 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" InitialTargets="showFlavor">
<Target Name="showFlavor" AfterTargets="Build">
<Message Importance="high" Text="building flavor $(Flavor)"></Message>
</Target>
<Import Project="../build-properties.props"/>
<Target Name="showFlavor" AfterTargets="Build">
<Message Importance="high" Text="building flavor $(Flavor)">
</Message>
</Target>
<Import Project="../build-properties.props" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
@@ -182,10 +183,10 @@
</ItemGroup>
<ItemGroup Condition=" '$(Flavor)'!='NoNet' ">
<PackageReference Include="FluentFTP">
<Version>48.0.0</Version>
<Version>51.1.0</Version>
</PackageReference>
<PackageReference Include="MegaApiClient">
<Version>1.10.3</Version>
<Version>1.10.4</Version>
</PackageReference>
<PackageReference Include="Microsoft.Graph">
<Version>1.21.0</Version>
@@ -312,4 +313,4 @@
<Target Name="AfterBuild">
</Target>
-->
</Project>
</Project>

View File

@@ -4,11 +4,10 @@ android {
namespace 'keepass2android.javafilestorage'
compileSdkVersion 33
defaultConfig {
minSdkVersion 15
minSdkVersion 21
targetSdkVersion 33
compileSdk 34
}
buildTypes {
release {
@@ -22,6 +21,10 @@ android {
sourceCompatibility 11
targetCompatibility 11
}
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
}
}
/*
@@ -30,27 +33,21 @@ NOTE: If you change dependencies here, don't forget to update the jar files in J
dependencies {
implementation 'com.squareup.okhttp3:okhttp:4.10.0-RC1'
implementation 'com.burgstaller:okhttp-digest:2.5'
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
implementation 'io.github.rburgst:okhttp-digest:3.1.0'
implementation 'com.google.http-client:google-http-client-gson:1.20.0'
implementation('com.google.api-client:google-api-client-android:1.30.5') {
exclude group: 'com.google.android.google-play-services'
}
implementation 'com.google.apis:google-api-services-drive:v2-rev102-1.16.0-rc'
implementation 'com.dropbox.core:dropbox-core-sdk:4.0.0'
implementation 'com.dropbox.core:dropbox-core-sdk:5.4.6'
implementation 'com.google.api-client:google-api-client:1.30.5'
implementation 'com.google.api-client:google-api-client-android:1.30.5'
implementation 'com.google.android.gms:play-services-auth:20.4.0'
//onedrive:
implementation('com.onedrive.sdk:onedrive-sdk-android:1.2.0') {
transitive = false
}
implementation 'com.pcloud.sdk:java-core:1.9.1'
implementation 'com.pcloud.sdk:android:1.9.1'
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.microsoft.services.msa:msa-auth:0.8.6'
implementation 'com.microsoft.aad:adal:1.14.0'
}

View File

@@ -1,436 +0,0 @@
package keepass2android.javafilestorage;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import androidx.annotation.NonNull;
import android.util.Log;
import com.onedrive.sdk.core.DefaultClientConfig;
import com.onedrive.sdk.core.IClientConfig;
import com.onedrive.sdk.core.OneDriveErrorCodes;
import com.onedrive.sdk.extensions.IItemCollectionPage;
import com.onedrive.sdk.extensions.IItemCollectionRequestBuilder;
import com.onedrive.sdk.extensions.IOneDriveClient;
import com.onedrive.sdk.extensions.Item;
import com.onedrive.sdk.extensions.OneDriveClient;
import com.onedrive.sdk.http.OneDriveServiceException;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Philipp on 20.11.2016.
*/
public class OneDriveStorage extends JavaFileStorageBase
{
final IClientConfig oneDriveConfig;
final keepass2android.javafilestorage.onedrive.MyMSAAuthenticator msaAuthenticator;
IOneDriveClient oneDriveClient;
public OneDriveStorage(final Context context, final String clientId) {
msaAuthenticator = new keepass2android.javafilestorage.onedrive.MyMSAAuthenticator(context) {
@Override
public String getClientId() {
return clientId;
}
@Override
public String[] getScopes() {
return new String[] { "offline_access", "onedrive.readwrite" };
}
};
oneDriveConfig = DefaultClientConfig.createWithAuthenticator(msaAuthenticator);
initAuthenticator(null);
}
@Override
public boolean requiresSetup(String path) {
return !isConnected(null);
}
@Override
public void startSelectFile(FileStorageSetupInitiatorActivity activity, boolean isForSave, int requestCode) {
initAuthenticator((Activity)activity.getActivity());
String path = getProtocolId()+":///";
Log.d("KP2AJ", "startSelectFile "+path+", connected: "+path);
if (isConnected(null))
{
Intent intent = new Intent();
intent.putExtra(EXTRA_IS_FOR_SAVE, isForSave);
intent.putExtra(EXTRA_PATH, path);
activity.onImmediateResult(requestCode, RESULT_FILECHOOSER_PREPARED, intent);
}
else
{
activity.startSelectFileProcess(path, isForSave, requestCode);
}
}
private boolean isConnected(Activity activity) {
if (oneDriveClient == null)
{
try
{
Log.d("KP2AJ", "trying silent login");
if (msaAuthenticator.loginSilent() != null)
{
Log.d("KP2AJ", "ok: silent login");
oneDriveClient = buildClient(activity);
}
else Log.d("KP2AJ", "trying silent login failed.");
}
catch (Exception e)
{
e.printStackTrace();
}
}
return oneDriveClient != null;
}
private void initAuthenticator(Activity activity) {
msaAuthenticator.init(
oneDriveConfig.getExecutors(),
oneDriveConfig.getHttpProvider(),
activity,
oneDriveConfig.getLogger());
}
@Override
public void prepareFileUsage(FileStorageSetupInitiatorActivity activity, String path, int requestCode, boolean alwaysReturnSuccess) {
initAuthenticator((Activity)activity.getActivity());
if (isConnected((Activity)activity.getActivity()))
{
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 "onedrive";
}
@Override
public void prepareFileUsage(Context appContext, String path) throws UserInteractionRequiredException {
if (!isConnected(null))
{
throw new UserInteractionRequiredException();
}
}
@Override
public void onCreate(FileStorageSetupActivity activity, Bundle savedInstanceState) {
Log.d("KP2AJ", "OnCreate");
}
@Override
public void onResume(final FileStorageSetupActivity activity) {
}
private IOneDriveClient buildClient(Activity activity) {
return new OneDriveClient.Builder()
.fromConfig(oneDriveConfig)
.loginAndBuildClient(activity);
}
String getPathFromSkydrivePath(String skydrivePath)
{
String path = "";
if (skydrivePath.equals(""))
return "";
String[] parts = skydrivePath.split("/");
for (int i = 0; i < parts.length; i++) {
String part = parts[i];
logDebug("parsing part " + part);
int indexOfSeparator = part.lastIndexOf(NAME_ID_SEP);
if (indexOfSeparator < 0) {
// seems invalid, but we're very generous here
path += "/" + part;
continue;
}
String name = part.substring(0, indexOfSeparator);
try {
name = decode(name);
} catch (UnsupportedEncodingException e) {
// ignore
}
path += "/" + name;
}
logDebug("return " +path + ". original was " + skydrivePath);
return path;
}
String removeProtocol(String path) throws Exception {
if (path == null)
return null;
if (path.startsWith("skydrive"))
return getPathFromSkydrivePath(path.substring("skydrive://".length()));
return path.substring(getProtocolId().length()+3);
}
@Override
public String getDisplayName(String path) {
if (path == null)
return null;
if (path.startsWith("skydrive"))
return getProtocolId()+"://"+getPathFromSkydrivePath(path.substring("skydrive://".length()));
return path;
}
@Override
public String getFilename(String path) throws Exception {
return path.substring(path.lastIndexOf("/")+1);
}
@Override
public boolean checkForFileChangeFast(String path, String previousFileVersion) throws Exception {
return false;
}
@Override
public String getCurrentFileVersionFast(String path) {
return null;
}
@Override
public InputStream openFileForRead(String path) throws Exception {
try {
path = removeProtocol(path);
logDebug("openFileForRead. Path="+path);
InputStream result = oneDriveClient.getDrive()
.getRoot()
.getItemWithPath(path)
.getContent()
.buildRequest()
.get();
logDebug("ok");
return result;
}
catch (OneDriveServiceException e)
{
throw convertException(e);
}
}
private Exception convertException(OneDriveServiceException e) {
if (e.isError(OneDriveErrorCodes.ItemNotFound))
return new FileNotFoundException(e.getMessage());
return e;
}
@Override
public void uploadFile(String path, byte[] data, boolean writeTransactional) throws Exception {
try {
path = removeProtocol(path);
oneDriveClient.getDrive()
.getRoot()
.getItemWithPath(path)
.getContent()
.buildRequest()
.put(data);
} catch (OneDriveServiceException e) {
throw convertException(e);
}
}
@Override
public String createFolder(String parentPath, String newDirName) throws Exception {
throw new Exception("not implemented.");
}
@Override
public String createFilePath(String parentPath, String newFileName) throws Exception {
String path = parentPath;
if (!path.endsWith("/"))
path = path + "/";
path = path + newFileName;
return path;
}
@Override
public List<FileEntry> listFiles(String parentPath) throws Exception {
try {
ArrayList<FileEntry> result = new ArrayList<FileEntry>();
parentPath = removeProtocol(parentPath);
IItemCollectionPage itemsPage = oneDriveClient.getDrive()
.getRoot()
.getItemWithPath(parentPath)
.getChildren()
.buildRequest()
.get();
if (parentPath.endsWith("/"))
parentPath = parentPath.substring(0,parentPath.length()-1);
while (true)
{
List<Item> items = itemsPage.getCurrentPage();
if (items.isEmpty())
return result;
for (Item i: items)
{
FileEntry e = getFileEntry(parentPath + "/" + i.name, i);
Log.d("KP2AJ", e.path);
result.add(e);
}
IItemCollectionRequestBuilder nextPageReqBuilder = itemsPage.getNextPage();
if (nextPageReqBuilder == null)
return result;
itemsPage = nextPageReqBuilder.buildRequest().get();
}
} catch (OneDriveServiceException e) {
throw convertException(e);
}
}
@NonNull
private FileEntry getFileEntry(String path, Item i) {
FileEntry e = new FileEntry();
if (i.size != null)
e.sizeInBytes = i.size;
else if ((i.remoteItem != null) && (i.remoteItem.size != null))
e.sizeInBytes = i.remoteItem.size;
e.displayName = i.name;
e.canRead = e.canWrite = true;
e.path = getProtocolId() +"://"+path;
if (i.lastModifiedDateTime != null)
e.lastModifiedTime = i.lastModifiedDateTime.getTimeInMillis();
else if ((i.remoteItem != null)&&(i.remoteItem.lastModifiedDateTime != null))
e.lastModifiedTime = i.remoteItem.lastModifiedDateTime.getTimeInMillis();
e.isDirectory = (i.folder != null) || ((i.remoteItem != null) && (i.remoteItem.folder != null));
return e;
}
@Override
public FileEntry getFileEntry(String filename) throws Exception {
try {
filename = removeProtocol(filename);
Item item = oneDriveClient.getDrive()
.getRoot()
.getItemWithPath(filename)
.buildRequest()
.get();
return getFileEntry(filename, item);
} catch (OneDriveServiceException e) {
throw convertException(e);
}
}
@Override
public void delete(String path) throws Exception {
try {
path = removeProtocol(path);
oneDriveClient.getDrive()
.getRoot()
.getItemWithPath(path)
.buildRequest()
.delete();
} catch (OneDriveServiceException e) {
throw convertException(e);
}
}
@Override
public void onStart(final FileStorageSetupActivity activity) {
Log.d("KP2AJ", "onStart");
if (activity.getProcessName().equals(PROCESS_NAME_SELECTFILE))
activity.getState().putString(EXTRA_PATH, activity.getPath());
JavaFileStorage.FileStorageSetupActivity storageSetupAct = activity;
if (oneDriveClient != null) {
Log.d("KP2AJ", "auth successful");
try {
finishActivityWithSuccess(activity);
return;
} catch (Exception e) {
Log.d("KP2AJ", "finish with error: " + e.toString());
finishWithError(activity, e);
return;
}
}
{
Log.d("KP2AJ", "Starting auth");
new AsyncTask<Object, Object, Object>() {
@Override
protected Object doInBackground(Object... params) {
try {
return buildClient((Activity) activity);
} catch (Exception e) {
return null;
}
}
@Override
protected void onPostExecute(Object o) {
if (o == null)
{
Log.i(TAG, "authenticating not successful");
Intent data = new Intent();
data.putExtra(EXTRA_ERROR_MESSAGE, "authenticating not succesful");
((Activity)activity).setResult(Activity.RESULT_CANCELED, data);
((Activity)activity).finish();
}
else
{
Log.i(TAG, "authenticating successful");
oneDriveClient = (IOneDriveClient) o;
finishActivityWithSuccess(activity);
}
}
}.execute();
}
}
@Override
public void onActivityResult(FileStorageSetupActivity activity, int requestCode, int resultCode, Intent data) {
}
}

View File

@@ -1,102 +0,0 @@
package keepass2android.javafilestorage.onedrive;
/**
* Created by Philipp on 22.11.2016.
*/
import com.microsoft.services.msa.LiveConnectSession;
import com.onedrive.sdk.authentication.AccountType;
import com.onedrive.sdk.authentication.IAccountInfo;
import com.onedrive.sdk.authentication.MSAAccountInfo;
import com.onedrive.sdk.authentication.MSAAuthenticator;
import com.onedrive.sdk.logger.ILogger;
import com.microsoft.services.msa.LiveConnectSession;
import com.onedrive.sdk.logger.ILogger;
/**
* Account information for a MSA based account.
*/
public class MyMSAAccountInfo implements IAccountInfo {
/**
* The service root for the OneDrive personal API.
*/
public static final String ONE_DRIVE_PERSONAL_SERVICE_ROOT = "https://api.onedrive.com/v1.0";
/**
* The authenticator that can refresh this account.
*/
private final MyMSAAuthenticator mAuthenticator;
/**
* The session this account is based off of.
*/
private LiveConnectSession mSession;
/**
* The logger.
*/
private final ILogger mLogger;
/**
* Creates an MSAAccountInfo object.
* @param authenticator The authenticator that this account info was created from.
* @param liveConnectSession The session this account is based off of.
* @param logger The logger.
*/
public MyMSAAccountInfo(final MyMSAAuthenticator authenticator,
final LiveConnectSession liveConnectSession,
final ILogger logger) {
mAuthenticator = authenticator;
mSession = liveConnectSession;
mLogger = logger;
}
/**
* Get the type of the account.
* @return The MicrosoftAccount account type.
*/
@Override
public AccountType getAccountType() {
return AccountType.MicrosoftAccount;
}
/**
* Get the access token for requests against the service root.
* @return The access token for requests against the service root.
*/
@Override
public String getAccessToken() {
return mSession.getAccessToken();
}
/**
* Get the OneDrive service root for this account.
* @return the OneDrive service root for this account.
*/
@Override
public String getServiceRoot() {
return ONE_DRIVE_PERSONAL_SERVICE_ROOT;
}
/**
* Indicates if the account access token is expired and needs to be refreshed.
* @return true if refresh() needs to be called and
* false if the account is still valid.
*/
@Override
public boolean isExpired() {
return mSession.isExpired();
}
/**
* Refreshes the authentication token for this account info.
*/
@Override
public void refresh() {
mLogger.logDebug("Refreshing access token...");
final MyMSAAccountInfo newInfo = (MyMSAAccountInfo)mAuthenticator.loginSilent();
mSession = newInfo.mSession;
}
}

View File

@@ -1,446 +0,0 @@
package keepass2android.javafilestorage.onedrive;
/**
* Created by Philipp on 22.11.2016.
*/
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import com.microsoft.onedrivesdk.BuildConfig;
import com.microsoft.services.msa.LiveAuthClient;
import com.microsoft.services.msa.LiveAuthException;
import com.microsoft.services.msa.LiveAuthListener;
import com.microsoft.services.msa.LiveConnectSession;
import com.microsoft.services.msa.LiveStatus;
import com.onedrive.sdk.authentication.ClientAuthenticatorException;
import com.onedrive.sdk.authentication.IAccountInfo;
import com.onedrive.sdk.authentication.IAuthenticator;
import com.onedrive.sdk.authentication.MSAAccountInfo;
import com.onedrive.sdk.concurrency.ICallback;
import com.onedrive.sdk.core.ClientException;
import com.onedrive.sdk.concurrency.SimpleWaiter;
import com.onedrive.sdk.concurrency.IExecutors;
import com.onedrive.sdk.core.OneDriveErrorCodes;
import com.onedrive.sdk.http.IHttpProvider;
import com.onedrive.sdk.logger.ILogger;
import java.security.InvalidParameterException;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicReference;
/**
* Wrapper around the MSA authentication library.
* https://github.com/MSOpenTech/msa-auth-for-android
*/
@SuppressWarnings("ThrowableResultOfMethodCallIgnored")
public abstract class MyMSAAuthenticator implements IAuthenticator {
private final Context mContext;
public MyMSAAuthenticator(Context context)
{
mContext = context;
}
/**
* The sign in cancellation message.
*/
private static final String SIGN_IN_CANCELLED_MESSAGE = "The user cancelled the login operation.";
/**
* The preferences for this authenticator.
*/
private static final String MSA_AUTHENTICATOR_PREFS = "MSAAuthenticatorPrefs";
/**
* The key for the user id.
*/
private static final String USER_ID_KEY = "userId";
/**
* The key for the version code
*/
public static final String VERSION_CODE_KEY = "versionCode";
/**
* The default user id
*/
private static final String DEFAULT_USER_ID = "@@defaultUser";
/**
* The active user id.
*/
private final AtomicReference<String> mUserId = new AtomicReference<>();
/**
* The executors.
*/
private IExecutors mExecutors;
/**
* Indicates whether this authenticator has been initialized.
*/
private boolean mInitialized;
/**
* The context UI interactions should happen with.
*/
private Activity mActivity;
/**
* The logger.
*/
private ILogger mLogger;
/**
* The client id for this authenticator.
* https://dev.onedrive.com/auth/msa_oauth.htm#to-register-your-app
* @return The client id.
*/
public abstract String getClientId();
/**
* The scopes for this application.
* https://dev.onedrive.com/auth/msa_oauth.htm#authentication-scopes
* @return The scopes for this application.
*/
public abstract String[] getScopes();
/**
* The live authentication client.
*/
private LiveAuthClient mAuthClient;
/**
* Initializes the authenticator.
* @param executors The executors to schedule foreground and background tasks.
* @param httpProvider The http provider for sending requests.
* @param activity The activity to create interactive UI on.
* @param logger The logger for diagnostic information.
*/
@Override
public synchronized void init(final IExecutors executors,
final IHttpProvider httpProvider,
final Activity activity,
final ILogger logger) {
mActivity = activity;
if (mInitialized) {
return;
}
mExecutors = executors;
mLogger = logger;
mInitialized = true;
mAuthClient = new LiveAuthClient(mContext, getClientId(), Arrays.asList(getScopes()));
final SharedPreferences prefs = getSharedPreferences();
mUserId.set(prefs.getString(USER_ID_KEY, null));
}
/**
* Starts an interactive login asynchronously.
* @param emailAddressHint The hint for the email address during the interactive login.
* @param loginCallback The callback to be called when the login is complete.
*/
@Override
public void login(final String emailAddressHint, final ICallback<IAccountInfo> loginCallback) {
Log.d("KP2AJ", "login()");
if (!mInitialized) {
throw new IllegalStateException("init must be called");
}
if (loginCallback == null) {
throw new InvalidParameterException("loginCallback");
}
mLogger.logDebug("Starting login async");
mExecutors.performOnBackground(new Runnable() {
@Override
public void run() {
try {
mExecutors.performOnForeground(login(emailAddressHint), loginCallback);
} catch (final ClientException e) {
mExecutors.performOnForeground(e, loginCallback);
}
}
});
}
/**
* Starts an interactive login.
* @param emailAddressHint The hint for the email address during the interactive login.
* @return The account info.
* @throws ClientException An exception occurs if the login was unable to complete for any reason.
*/
@Override
public synchronized IAccountInfo login(final String emailAddressHint) throws ClientException {
if (!mInitialized) {
throw new IllegalStateException("init must be called");
}
mLogger.logDebug("Starting login");
final AtomicReference<ClientException> error = new AtomicReference<>();
final SimpleWaiter waiter = new SimpleWaiter();
final LiveAuthListener listener = new LiveAuthListener() {
@Override
public void onAuthComplete(final LiveStatus liveStatus,
final LiveConnectSession liveConnectSession,
final Object o) {
if (liveStatus == LiveStatus.NOT_CONNECTED) {
mLogger.logDebug("Received invalid login failure from silent authentication with MSA, ignoring.");
} else {
mLogger.logDebug("Successful interactive login");
waiter.signal();
}
}
@Override
public void onAuthError(final LiveAuthException e,
final Object o) {
OneDriveErrorCodes code = OneDriveErrorCodes.AuthenticationFailure;
if (e.getError().equals(SIGN_IN_CANCELLED_MESSAGE)) {
code = OneDriveErrorCodes.AuthenticationCancelled;
}
error.set(new ClientAuthenticatorException("Unable to login with MSA", e, code));
mLogger.logError(error.get().getMessage(), error.get());
waiter.signal();
}
};
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mAuthClient.login(mActivity, /* scopes */null, /* user object */ null, emailAddressHint, listener);
}
});
mLogger.logDebug("Waiting for MSA callback");
waiter.waitForSignal();
final ClientException exception = error.get();
if (exception != null) {
throw exception;
}
final String userId;
if (emailAddressHint != null) {
userId = emailAddressHint;
} else {
userId = DEFAULT_USER_ID;
}
mUserId.set(userId);
final SharedPreferences prefs = getSharedPreferences();
prefs.edit()
.putString(USER_ID_KEY, mUserId.get())
.putInt(VERSION_CODE_KEY, BuildConfig.VERSION_CODE)
.apply();
return getAccountInfo();
}
/**
* Starts a silent login asynchronously.
* @param loginCallback The callback to be called when the login is complete.
*/
@Override
public void loginSilent(final ICallback<IAccountInfo> loginCallback) {
if (!mInitialized) {
throw new IllegalStateException("init must be called");
}
if (loginCallback == null) {
throw new InvalidParameterException("loginCallback");
}
mLogger.logDebug("Starting login silent async");
mExecutors.performOnBackground(new Runnable() {
@Override
public void run() {
try {
mExecutors.performOnForeground(loginSilent(), loginCallback);
} catch (final ClientException e) {
mExecutors.performOnForeground(e, loginCallback);
}
}
});
}
/**
* Starts a silent login.
* @return The account info.
* @throws ClientException An exception occurs if the login was unable to complete for any reason.
*/
@Override
public synchronized IAccountInfo loginSilent() throws ClientException {
if (!mInitialized) {
throw new IllegalStateException("init must be called");
}
mLogger.logDebug("Starting login silent");
final int userIdStoredMinVersion = 10112;
if (getSharedPreferences().getInt(VERSION_CODE_KEY, 0) >= userIdStoredMinVersion
&& mUserId.get() == null) {
mLogger.logDebug("No login information found for silent authentication");
return null;
}
final SimpleWaiter loginSilentWaiter = new SimpleWaiter();
final AtomicReference<ClientException> error = new AtomicReference<>();
final boolean waitForCallback = mAuthClient.loginSilent(new LiveAuthListener() {
@Override
public void onAuthComplete(final LiveStatus liveStatus,
final LiveConnectSession liveConnectSession,
final Object o) {
if (liveStatus == LiveStatus.NOT_CONNECTED) {
error.set(new ClientAuthenticatorException("Failed silent login, interactive login required",
OneDriveErrorCodes.AuthenticationFailure));
mLogger.logError(error.get().getMessage(), error.get());
} else {
mLogger.logDebug("Successful silent login");
}
loginSilentWaiter.signal();
}
@Override
public void onAuthError(final LiveAuthException e,
final Object o) {
OneDriveErrorCodes code = OneDriveErrorCodes.AuthenticationFailure;
if (e.getError().equals(SIGN_IN_CANCELLED_MESSAGE)) {
code = OneDriveErrorCodes.AuthenticationCancelled;
}
error.set(new ClientAuthenticatorException("Login silent authentication error", e, code));
mLogger.logError(error.get().getMessage(), error.get());
loginSilentWaiter.signal();
}
});
if (!waitForCallback) {
mLogger.logDebug("MSA silent auth fast-failed");
return null;
}
mLogger.logDebug("Waiting for MSA callback");
loginSilentWaiter.waitForSignal();
final ClientException exception = error.get();
if (exception != null) {
throw exception;
}
return getAccountInfo();
}
/**
* Log the current user out.
* @param logoutCallback The callback to be called when the logout is complete.
*/
@Override
public void logout(final ICallback<Void> logoutCallback) {
if (!mInitialized) {
throw new IllegalStateException("init must be called");
}
if (logoutCallback == null) {
throw new InvalidParameterException("logoutCallback");
}
mLogger.logDebug("Starting logout async");
mExecutors.performOnBackground(new Runnable() {
@Override
public void run() {
try {
logout();
mExecutors.performOnForeground((Void) null, logoutCallback);
} catch (final ClientException e) {
mExecutors.performOnForeground(e, logoutCallback);
}
}
});
}
/**
* Log the current user out.
* @throws ClientException An exception occurs if the logout was unable to complete for any reason.
*/
@Override
public synchronized void logout() throws ClientException {
if (!mInitialized) {
throw new IllegalStateException("init must be called");
}
mLogger.logDebug("Starting logout");
final SimpleWaiter logoutWaiter = new SimpleWaiter();
final AtomicReference<ClientException> error = new AtomicReference<>();
mAuthClient.logout(new LiveAuthListener() {
@Override
public void onAuthComplete(final LiveStatus liveStatus,
final LiveConnectSession liveConnectSession,
final Object o) {
mLogger.logDebug("Logout completed");
logoutWaiter.signal();
}
@Override
public void onAuthError(final LiveAuthException e, final Object o) {
error.set(new ClientAuthenticatorException("MSA Logout failed",
e,
OneDriveErrorCodes.AuthenticationFailure));
mLogger.logError(error.get().getMessage(), error.get());
logoutWaiter.signal();
}
});
mLogger.logDebug("Waiting for logout to complete");
logoutWaiter.waitForSignal();
mLogger.logDebug("Clearing all MSA Authenticator shared preferences");
final SharedPreferences prefs = getSharedPreferences();
prefs.edit()
.clear()
.putInt(VERSION_CODE_KEY, BuildConfig.VERSION_CODE)
.apply();
mUserId.set(null);
final ClientException exception = error.get();
if (exception != null) {
throw exception;
}
}
/**
* Gets the current account info for this authenticator.
* @return NULL if no account is available.
*/
@Override
public IAccountInfo getAccountInfo() {
final LiveConnectSession session = mAuthClient.getSession();
if (session == null) {
return null;
}
return new MyMSAAccountInfo(this, session, mLogger);
}
/**
* Gets the shared preferences for this authenticator.
* @return The shared preferences.
*/
private SharedPreferences getSharedPreferences() {
return mContext.getSharedPreferences(MSA_AUTHENTICATOR_PREFS, Context.MODE_PRIVATE);
}
}

View File

@@ -6,7 +6,7 @@ buildscript {
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:7.4.0"
classpath "com.android.tools.build:gradle:8.4.0"
}
}

View File

@@ -1 +1,2 @@
org.gradle.jvmargs=-Xmx1536m
android.useAndroidX=true

View File

@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip

View File

@@ -145,7 +145,9 @@ import java.util.ArrayList;
import java.util.List;
//import keepass2android.javafilestorage.DropboxCloudRailStorage;
import keepass2android.javafilestorage.DropboxV2Storage;
import keepass2android.javafilestorage.GoogleDriveAppDataFileStorage;
import keepass2android.javafilestorage.ICertificateErrorHandler;
import keepass2android.javafilestorage.JavaFileStorage;
import keepass2android.javafilestorage.JavaFileStorage.FileEntry;
import keepass2android.javafilestorage.PCloudFileStorage;
@@ -347,7 +349,7 @@ public class MainActivity extends Activity implements JavaFileStorage.FileStorag
fileList = fs.listFiles(path);
checkFileList(path, fileList, false, true); //second param indicates the file must be gone
Log.d("KP2AJ", "Delete a folder recursive");
Log.d("KP2AJ", "xDelete a folder recursive: " + subfolderPath);
fs.delete(subfolderPath);
Log.d("KP2AJ", "List files again to check if deleting the folder was successful:");
@@ -540,12 +542,12 @@ public class MainActivity extends Activity implements JavaFileStorage.FileStorag
static JavaFileStorage createStorageToTest(Context ctx, Context appContext, boolean simulateRestart) {
//storageToTest = new SftpStorage(ctx.getApplicationContext());
storageToTest = new PCloudFileStorage(ctx, "FLm22de7bdS", "pcloud", "pcloudtest");
//storageToTest = new PCloudFileStorage(ctx, "FLm22de7bdS", "pcloud", "pcloudtest");
//storageToTest = new SkyDriveFileStorage("000000004010C234", appContext);
//storageToTest = new GoogleDriveAppDataFileStorage();
/*storageToTest = new WebDavStorage(new ICertificateErrorHandler() {
storageToTest = new WebDavStorage(new ICertificateErrorHandler() {
@Override
public boolean onValidationError(String error) {
return false;
@@ -555,7 +557,7 @@ public class MainActivity extends Activity implements JavaFileStorage.FileStorag
public boolean alwaysFailOnValidationError() {
return false;
}
});*/
});
//storageToTest = new DropboxV2Storage(ctx,"4ybka4p4a1027n6", "1z5lv528un9nre8", !simulateRestart);
//storageToTest = new DropboxFileStorage(ctx,"4ybka4p4a1027n6", "1z5lv528un9nre8", !simulateRestart);

View File

@@ -15,7 +15,7 @@
android:layout_height="wrap_content"
android:singleLine="true"
android:inputType="textNoSuggestions"
android:text="https://daigers.diskstation.me:5006/Keepass2Android/Apps/Keepass2Android/"
android:text="https://webdav.hidrive.ionos.com/users/philippcro"
android:hint="Server URL" />
</LinearLayout>
<EditText
@@ -23,7 +23,7 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:text="Keepass"
android:text="PhilippCro"
android:hint="@string/hint_username" />
<EditText
@@ -32,7 +32,7 @@
android:layout_height="wrap_content"
android:inputType="textPassword"
android:singleLine="true"
android:text="$T3st17$"
android:text="WSBa1wh4o4YyLK"
android:hint="@string/hint_pass"
android:importantForAccessibility="no" />

View File

@@ -7,7 +7,7 @@ buildscript {
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:7.4.0"
classpath "com.android.tools.build:gradle:8.4.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files

View File

@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip

View File

@@ -4,11 +4,13 @@ android {
namespace 'keepass2android.kp2akeytransform'
compileSdkVersion 33
defaultConfig {
ndk.abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'
minSdkVersion 21
targetSdkVersion 34
compileSdk 34
}

View File

@@ -5,7 +5,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:7.4.0"
classpath "com.android.tools.build:gradle:8.4.0"
}
}

View File

@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip

View File

@@ -3,10 +3,12 @@ android {
namespace 'keepass2android.softkeyboard'
compileSdkVersion 33
defaultConfig {
minSdkVersion 18
minSdkVersion 21
compileSdk 34
targetSdk 34
}
buildTypes {

View File

@@ -5,7 +5,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:7.4.0"
classpath "com.android.tools.build:gradle:8.4.0"
}
}

View File

@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip

View File

@@ -6,7 +6,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:7.4.0"
classpath "com.android.tools.build:gradle:8.4.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files

View File

@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip

View File

@@ -18,6 +18,10 @@ android {
debuggable false
}
}
buildFeatures {
buildConfig true
}
compileOptions {
targetCompatibility 11
sourceCompatibility 11

View File

@@ -6,7 +6,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:7.4.0"
classpath "com.android.tools.build:gradle:8.4.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files

View File

@@ -1,6 +1,6 @@
#Tue Sep 20 20:32:06 CEST 2016
#Tue Oct 08 15:41:22 CEST 2024
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip

View File

@@ -40,7 +40,7 @@
</intent>
</queries>
<uses-sdk android:minSdkVersion="18" android:targetSdkVersion="33" />
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="33" />
<permission android:description="@string/permission_desc2" android:icon="@drawable/ic_launcher_offline" android:label="KP2A entry search" android:name="keepass2android.keepass2android_nonet.permission.KP2aInternalSearch" android:protectionLevel="signature" />
<permission android:description="@string/permission_desc3" android:icon="@drawable/ic_launcher_offline" android:label="KP2A choose autofill dataset" android:name="keepass2android.keepass2android_nonet.permission.Kp2aChooseAutofill" android:protectionLevel="signature" />
<application

View File

@@ -828,7 +828,7 @@ namespace keepass2android
new DropboxAppFolderFileStorage(LocaleManager.LocalizedAppContext, this),
GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(LocaleManager.LocalizedAppContext)==ConnectionResult.Success ? new GoogleDriveFileStorage(LocaleManager.LocalizedAppContext, this) : null,
GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(LocaleManager.LocalizedAppContext)==ConnectionResult.Success ? new GoogleDriveAppDataFileStorage(LocaleManager.LocalizedAppContext, this) : null,
new OneDriveFileStorage(LocaleManager.LocalizedAppContext, this),
new OneDriveFileStorage(),
new OneDrive2FullFileStorage(),
new OneDrive2MyFilesFileStorage(),
new OneDrive2AppFolderFileStorage(),

View File

@@ -88,7 +88,7 @@
</Choose>
<ItemGroup Condition=" '$(Flavor)'=='NoNet' ">
<PackageReference Include="Newtonsoft.Json">
<Version>13.0.1</Version>
<Version>13.0.3</Version>
</PackageReference>
</ItemGroup>
<ItemGroup>

View File

@@ -13,9 +13,6 @@ using keepass2android.services.AutofillBase.model;
using System.Linq;
using Android.Content.PM;
using Kp2aAutofillParser;
#if !NoNet
using Com.Dropbox.Core.V2.Teamlog;
#endif
using AlertDialog = Android.App.AlertDialog;
namespace keepass2android.services.AutofillBase