├── app ├── .gitignore ├── src │ ├── main │ │ ├── res │ │ │ ├── drawable │ │ │ │ ├── nc_background.png │ │ │ │ ├── ic_baseline_expand_more_24.xml │ │ │ │ ├── ic_baseline_delete_24_white.xml │ │ │ │ ├── ic_baseline_list_24.xml │ │ │ │ ├── ic_baseline_get_app_24.xml │ │ │ │ ├── ic_baseline_open_in_new_grey.xml │ │ │ │ ├── ic_baseline_logout_24_grey.xml │ │ │ │ ├── ic_baseline_delete_24.xml │ │ │ │ ├── ic_baseline_edit_24.xml │ │ │ │ ├── ic_baseline_save_24_white.xml │ │ │ │ ├── ic_baseline_vpn_key_24.xml │ │ │ │ ├── ic_baseline_refresh_24.xml │ │ │ │ ├── ic_baseline_sort_by_alpha_24.xml │ │ │ │ ├── ic_baseline_lock_24.xml │ │ │ │ ├── ic_baseline_qr_code_scanner_24.xml │ │ │ │ ├── ic_baseline_share_24.xml │ │ │ │ └── login_decision_button.xml │ │ │ ├── drawable-hdpi │ │ │ │ ├── ic_eye_grey.png │ │ │ │ ├── ic_plus_white.png │ │ │ │ ├── logo_vertical.png │ │ │ │ ├── ic_eye_off_grey.png │ │ │ │ ├── logo_horizontal.png │ │ │ │ ├── ic_action_edit_white.png │ │ │ │ ├── ic_action_save_white.png │ │ │ │ └── ic_content_copy_grey.png │ │ │ ├── drawable-mdpi │ │ │ │ ├── ic_eye_grey.png │ │ │ │ ├── ic_plus_white.png │ │ │ │ ├── logo_vertical.png │ │ │ │ ├── ic_eye_off_grey.png │ │ │ │ ├── logo_horizontal.png │ │ │ │ ├── ic_action_edit_white.png │ │ │ │ ├── ic_action_save_white.png │ │ │ │ └── ic_content_copy_grey.png │ │ │ ├── mipmap-hdpi │ │ │ │ ├── fa_clipboard.png │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_monochrome.png │ │ │ ├── mipmap-mdpi │ │ │ │ ├── fa_clipboard.png │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_monochrome.png │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── fa_clipboard.png │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_monochrome.png │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── fa_clipboard.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_monochrome.png │ │ │ ├── drawable-xhdpi │ │ │ │ ├── ic_eye_grey.png │ │ │ │ ├── ic_eye_off_grey.png │ │ │ │ ├── ic_plus_white.png │ │ │ │ ├── logo_horizontal.png │ │ │ │ ├── logo_vertical.png │ │ │ │ ├── ic_action_edit_white.png │ │ │ │ ├── ic_action_save_white.png │ │ │ │ └── ic_content_copy_grey.png │ │ │ ├── drawable-xxhdpi │ │ │ │ ├── ic_eye_grey.png │ │ │ │ ├── ic_plus_white.png │ │ │ │ ├── logo_vertical.png │ │ │ │ ├── ic_eye_off_grey.png │ │ │ │ ├── logo_horizontal.png │ │ │ │ ├── ic_action_edit_white.png │ │ │ │ ├── ic_action_save_white.png │ │ │ │ └── ic_content_copy_grey.png │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── fa_clipboard.png │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_monochrome.png │ │ │ ├── drawable-xxxhdpi │ │ │ │ ├── ic_eye_grey.png │ │ │ │ ├── ic_plus_white.png │ │ │ │ ├── logo_vertical.png │ │ │ │ ├── ic_eye_off_grey.png │ │ │ │ ├── logo_horizontal.png │ │ │ │ ├── ic_action_edit_white.png │ │ │ │ ├── ic_action_save_white.png │ │ │ │ └── ic_content_copy_grey.png │ │ │ ├── xml │ │ │ │ ├── autofill_service.xml │ │ │ │ └── network_security_config.xml │ │ │ ├── anim │ │ │ │ ├── slide_in_left.xml │ │ │ │ ├── slide_in_right.xml │ │ │ │ ├── slide_out_left.xml │ │ │ │ ├── slide_out_right.xml │ │ │ │ └── scanner.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ └── ic_launcher.xml │ │ │ ├── values │ │ │ │ ├── arrays.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── colors.xml │ │ │ │ └── styles.xml │ │ │ ├── values-v21 │ │ │ │ └── styles.xml │ │ │ ├── values-w820dp │ │ │ │ └── dimens.xml │ │ │ ├── menu │ │ │ │ ├── menu_credential_item_fragment.xml │ │ │ │ ├── menu_credential_display.xml │ │ │ │ └── menu_password_list.xml │ │ │ ├── layout │ │ │ │ ├── activity_autofill_interaction.xml │ │ │ │ ├── content_otp_progress.xml │ │ │ │ ├── activity_scan_qrcode.xml │ │ │ │ ├── progress_dialog.xml │ │ │ │ ├── content_password_list.xml │ │ │ │ ├── autofill_list_item.xml │ │ │ │ ├── fragment_credential_item.xml │ │ │ │ ├── fragment_credential_file_item.xml │ │ │ │ ├── autofill_list_item_with_icon.xml │ │ │ │ ├── fragment_edit_password_text_item.xml │ │ │ │ ├── fragment_vault_list.xml │ │ │ │ ├── fragment_copy_text_item.xml │ │ │ │ ├── content_sso_settings.xml │ │ │ │ ├── activity_password_list.xml │ │ │ │ ├── fragment_vault_edit.xml │ │ │ │ ├── activity_login.xml │ │ │ │ ├── fragment_credential_item_list.xml │ │ │ │ ├── content_manual_server_connection_settings.xml │ │ │ │ ├── fragment_vault_delete.xml │ │ │ │ └── fragment_vault_lock_screen.xml │ │ │ ├── values-ja-rJP │ │ │ │ └── strings.xml │ │ │ ├── values-el │ │ │ │ └── strings.xml │ │ │ ├── values-da │ │ │ │ └── strings.xml │ │ │ └── values-ca │ │ │ │ └── strings.xml │ │ ├── java │ │ │ └── es │ │ │ │ └── wolfi │ │ │ │ ├── utils │ │ │ │ ├── Filterable.java │ │ │ │ ├── otp │ │ │ │ │ ├── CodeGenerationException.java │ │ │ │ │ ├── Base32Decoder.java │ │ │ │ │ └── HashingAlgorithm.java │ │ │ │ ├── ListUtils.java │ │ │ │ ├── ColorUtils.java │ │ │ │ ├── JSONUtils.java │ │ │ │ ├── CredentialLabelSort.java │ │ │ │ ├── SSOUtils.java │ │ │ │ ├── QrCodeAnalyzer.java │ │ │ │ ├── ProgressUtils.java │ │ │ │ ├── IconUtils.java │ │ │ │ └── FilterListAsyncTask.java │ │ │ │ ├── app │ │ │ │ ├── passman │ │ │ │ │ ├── CallbackNames.java │ │ │ │ │ ├── OfflineStorageValues.java │ │ │ │ │ ├── autofill │ │ │ │ │ │ └── AutofillFieldCollection.java │ │ │ │ │ ├── SettingValues.java │ │ │ │ │ ├── SJCLCrypto.java │ │ │ │ │ ├── SingleTon.java │ │ │ │ │ ├── activities │ │ │ │ │ │ └── ShortcutActivity.java │ │ │ │ │ ├── adapters │ │ │ │ │ │ └── FileViewAdapter.java │ │ │ │ │ └── PassmanReceiver.java │ │ │ │ └── ResponseHandlers │ │ │ │ │ ├── FileDeleteResponseHandler.java │ │ │ │ │ ├── CustomFieldFileDeleteResponseHandler.java │ │ │ │ │ └── CoreAPIGETResponseHandler.java │ │ │ │ └── passman │ │ │ │ └── API │ │ │ │ ├── SharingACL.java │ │ │ │ ├── CredentialACL.java │ │ │ │ └── CustomField.java │ │ ├── cpp │ │ │ ├── SJCL.h │ │ │ ├── base64.h │ │ │ └── passman-lib.cpp │ │ └── AndroidManifest.xml │ ├── test │ │ └── java │ │ │ └── es │ │ │ └── wolfi │ │ │ └── app │ │ │ └── passman │ │ │ └── ExampleUnitTest.java │ └── androidTest │ │ └── java │ │ └── es │ │ └── wolfi │ │ └── app │ │ └── passman │ │ └── ExampleInstrumentedTest.java ├── proguard-rules.pro └── CMakeLists.txt ├── settings.gradle ├── fastlane └── metadata │ └── android │ ├── en-US │ ├── title.txt │ ├── changelogs │ │ ├── 11.txt │ │ ├── 17.txt │ │ ├── 15.txt │ │ ├── 13.txt │ │ ├── 19.txt │ │ ├── 20.txt │ │ ├── 18.txt │ │ ├── 12.txt │ │ ├── 16.txt │ │ ├── 10.txt │ │ ├── 9.txt │ │ └── 14.txt │ ├── short_description.txt │ ├── images │ │ ├── icon.png │ │ └── phoneScreenshots │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ ├── 3.png │ │ │ ├── 4.png │ │ │ ├── 5.png │ │ │ ├── 6.png │ │ │ ├── 7.png │ │ │ ├── 8.png │ │ │ ├── 9.png │ │ │ └── 10.png │ └── full_description.txt │ └── de │ └── short_description.txt ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitmodules ├── .drone.yml ├── openssl.conf.example ├── .gitignore ├── gradle.properties.example ├── PRIVACY.md ├── gradlew.bat ├── README.md └── .tx └── config /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/title.txt: -------------------------------------------------------------------------------- 1 | Passman 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/11.txt: -------------------------------------------------------------------------------- 1 | - fix app crash if no automatic autofill vault can be selected 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de/short_description.txt: -------------------------------------------------------------------------------- 1 | greife auf Deiner in der Nextcloud Passman App gespeicherten Credentials zu -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/short_description.txt: -------------------------------------------------------------------------------- 1 | Allow you to manage the credentials stored in your Nextcloud Passman app. 2 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/nc_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable/nc_background.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_eye_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-hdpi/ic_eye_grey.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_eye_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-mdpi/ic_eye_grey.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/fa_clipboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-hdpi/fa_clipboard.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/fa_clipboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-mdpi/fa_clipboard.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/fa_clipboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-xhdpi/fa_clipboard.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/17.txt: -------------------------------------------------------------------------------- 1 | - fix wrong named internal autofill service 2 | - update translations 3 | - update dependencies 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_plus_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-hdpi/ic_plus_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/logo_vertical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-hdpi/logo_vertical.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_plus_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-mdpi/ic_plus_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/logo_vertical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-mdpi/logo_vertical.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_eye_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xhdpi/ic_eye_grey.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_eye_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xxhdpi/ic_eye_grey.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/fa_clipboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-xxhdpi/fa_clipboard.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/fa_clipboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-xxxhdpi/fa_clipboard.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/fastlane/metadata/android/en-US/images/icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_eye_off_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-hdpi/ic_eye_off_grey.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/logo_horizontal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-hdpi/logo_horizontal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_eye_off_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-mdpi/ic_eye_off_grey.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/logo_horizontal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-mdpi/logo_horizontal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_eye_off_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xhdpi/ic_eye_off_grey.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_plus_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xhdpi/ic_plus_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/logo_horizontal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xhdpi/logo_horizontal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/logo_vertical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xhdpi/logo_vertical.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_plus_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xxhdpi/ic_plus_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/logo_vertical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xxhdpi/logo_vertical.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_eye_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xxxhdpi/ic_eye_grey.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_plus_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xxxhdpi/ic_plus_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/logo_vertical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xxxhdpi/logo_vertical.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_eye_off_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xxhdpi/ic_eye_off_grey.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/logo_horizontal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xxhdpi/logo_horizontal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_eye_off_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xxxhdpi/ic_eye_off_grey.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/logo_horizontal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xxxhdpi/logo_horizontal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_action_edit_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-hdpi/ic_action_edit_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_action_save_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-hdpi/ic_action_save_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_content_copy_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-hdpi/ic_content_copy_grey.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_action_edit_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-mdpi/ic_action_edit_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_action_save_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-mdpi/ic_action_save_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_content_copy_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-mdpi/ic_content_copy_grey.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_action_edit_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xhdpi/ic_action_edit_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_action_save_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xhdpi/ic_action_save_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_content_copy_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xhdpi/ic_content_copy_grey.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_action_edit_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xxhdpi/ic_action_edit_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_action_save_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xxhdpi/ic_action_save_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_content_copy_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xxhdpi/ic_content_copy_grey.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_action_edit_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xxxhdpi/ic_action_edit_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_action_save_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xxxhdpi/ic_action_save_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_content_copy_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/drawable-xxxhdpi/ic_content_copy_grey.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/7.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/8.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/9.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/passman-android/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/10.png -------------------------------------------------------------------------------- /app/src/main/res/xml/autofill_service.xml: -------------------------------------------------------------------------------- 1 | 3 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/15.txt: -------------------------------------------------------------------------------- 1 | - fix KeyStore initialization 2 | - fix reloading credential in the fragment view after editing 3 | - fix some null pointer exceptions 4 | - add privacy policy to the repository 5 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/13.txt: -------------------------------------------------------------------------------- 1 | - fix ConcurrentModificationException after editing or deleting a credential 2 | - fix OTP generation 3 | - some other bug fixes 4 | - unify button position 5 | - replace char with character in translations 6 | - add missing translations 7 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Mar 22 14:20:29 GMT 2022 2 | distributionBase=GRADLE_USER_HOME 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip 4 | distributionPath=wrapper/dists 5 | zipStorePath=wrapper/dists 6 | zipStoreBase=GRADLE_USER_HOME 7 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "app/src/main/cpplibs/openssl"] 2 | path = app/src/main/cpplibs/openssl 3 | url = https://github.com/openssl/openssl.git 4 | branch = openssl-3.5 5 | ignore = dirty 6 | [submodule "app/src/main/cpplibs/SimpleJSON"] 7 | path = app/src/main/cpplibs/SimpleJSON 8 | url = https://github.com/MJPA/SimpleJSON.git 9 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/19.txt: -------------------------------------------------------------------------------- 1 | - refactor OTP integration with support for all rfc specified otp algorithms (sha1, sha256, sha512) 2 | - fix OTP generation for android systems <= 8.1 3 | - themed app icon 4 | - update openssl from version 1.1.1 stable to 3.5 lts 5 | - update to NDK r28b 6 | - update various dependencies 7 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/20.txt: -------------------------------------------------------------------------------- 1 | - refactor OTP integration with support for all rfc specified otp algorithms (sha1, sha256, sha512) 2 | - fix OTP generation for android systems <= 8.1 3 | - themed app icon 4 | - update openssl from version 1.1.1 stable to 3.5 lts 5 | - update to NDK r28b 6 | - update various dependencies 7 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/18.txt: -------------------------------------------------------------------------------- 1 | - implement showing / editing of shared credentials 2 | - implement manual credential search as autofill fallback for no matching credentials (see settings) 3 | - improve autofill behaviour 4 | - migrate from butterknive to android native view binding 5 | - various bug fixes 6 | - update dependencies 7 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_in_left.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_in_right.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_out_left.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_out_right.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_expand_more_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/arrays.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | HTTPS 5 | HTTP 6 | 7 | 8 | Text 9 | Password 10 | File 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 16dp 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_delete_24_white.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.drone.yml: -------------------------------------------------------------------------------- 1 | pipeline: 2 | clone: 3 | image: plugins/git 4 | depth: 1 5 | verified-check: 6 | image: python 7 | commands: 8 | - wget https://raw.githubusercontent.com/brantje/passman-ci/master/verified-check.py 9 | - pip install requests 10 | - python ./verified-check.py 11 | when: 12 | matrix: 13 | TESTS: verified-check 14 | matrix: 15 | include: 16 | - TESTS: verified-check -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/12.txt: -------------------------------------------------------------------------------- 1 | - Add password generator app shortcut. 2 | - Add password generator and toggle button to credential add/edit forms. 3 | - Add option to clear clipboard automatically after a defined delay. 4 | - Show credential icons (requires at least Android 6 for SVG icons). 5 | - Show, edit, delete credentials shared with others. 6 | - Update dependencies. 7 | - Stability improvements. 8 | - Code cleanup. 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_list_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_get_app_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_open_in_new_grey.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/xml/network_security_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_logout_24_grey.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/anim/scanner.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_delete_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_edit_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_save_24_white.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/16.txt: -------------------------------------------------------------------------------- 1 | - add Nextcloud Files app based Single-Sign-On (SSO) login option 2 | - SSO requires Nextcloud Files app version >= 3.18 3 | - add/edit OTP manually or scan from QR code 4 | - add FAQ GitHub link to menu 5 | - unify unlock button as hover button 6 | - update custom field value design 7 | - update compileSdkVersion to 32 8 | - show error message if login fails #135 9 | - fix login screen in landscape orientation 10 | - general fixes and improvements 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_vpn_key_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_credential_item_fragment.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_credential_display.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 8dp 6 | 18dp 7 | 16dp 8 | 16dp 9 | 192dp 10 | 11 | -------------------------------------------------------------------------------- /app/src/test/java/es/wolfi/app/passman/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package es.wolfi.app.passman; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() throws Exception { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_autofill_interaction.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_refresh_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/10.txt: -------------------------------------------------------------------------------- 1 | - New confirm dialog to delete a credential 2 | - New option to sort credentials by label 3 | - Migrated save and delete buttons to floating action buttons 4 | - Fix broken messages when the keyboard was open 5 | - Use uniform (editable) connect/response timeouts for common api requests 6 | - Fix endless loading dialog after deleting a credential 7 | - Fix autofill vault selection if the vault is active and selected as default 8 | - Security fixes that could have ended on memory corruption on the cryptographic c++ core 9 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/9.txt: -------------------------------------------------------------------------------- 1 | - Add support for managing credentials and files 2 | - New app settings, vault refresh and lock buttons 3 | - New loading dialog 4 | - Deactivate the computationally expensive OTP generation if no OTP has been specified 5 | - Add support for user CA certificates (requires at least Android 7.x) 6 | - Mark compromised credentials 7 | - Add URL copy and open button 8 | - Add app start password option based on the android user authentication 9 | - Implement Android autofill feature (requires at least Android 8) 10 | -------------------------------------------------------------------------------- /openssl.conf.example: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [[ -z $ANDROID_HOME ]]; then 4 | export ANDROID_HOME=$HOME/Android/Sdk 5 | fi 6 | 7 | export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/28.1.13356709 8 | export HOST_TAG=linux-x86_64 # darwin-x86_64 / linux-x86_64 / windows / windows-x86_64 9 | export MIN_SDK_VERSION=21 10 | 11 | export CFLAGS="-Os -ffunction-sections -fdata-sections -fno-unwind-tables -fno-asynchronous-unwind-tables" 12 | export LDFLAGS="-Wl,-s -Wl,-Bsymbolic -Wl,--gc-sections" 13 | export THREADS=12 # Number of threads to use while compiling openssl 14 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/14.txt: -------------------------------------------------------------------------------- 1 | - add offline cache (can be disabled in settings) 2 | - add local storage encryption for sensitive data (requires at least Android 6 / API 23) 3 | - encrypts the offline cache 4 | - stored vault passwords have to be re-entered 5 | - cloud connection settings will be migrated automatically 6 | - add an internal settings cache to speed up some things a bit 7 | - add vault actions (add, rename, delete) 8 | - delete action requires at least Passman v2.4.0 (server side) 9 | - update dependencies (gradle/appcompat) 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_sort_by_alpha_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/layout/content_otp_progress.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_lock_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_qr_code_scanner_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_share_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_scan_qrcode.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_password_list.xml: -------------------------------------------------------------------------------- 1 | 5 | 9 | 13 | 17 | 18 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/full_description.txt: -------------------------------------------------------------------------------- 1 | This is an Android app for the Nextcloud password manager Passman. 2 | 3 | This app is only compatible with Passman V2.x or higher. 4 | 5 | Features 6 | 7 | * Setup app (enter the nextcloud server settings or use SSO) 8 | * App start password option based on the android user authentication 9 | * View, add, rename and delete vaults 10 | * Login to vault 11 | * Display credential list 12 | * View, add, edit and delete credentials 13 | * Add, download and delete files 14 | * OTP generation 15 | * Basic Android autofill implementation 16 | * Password generator 17 | * Encrypted offline cache 18 | * Encrypted stored vault and cloud connection passwords 19 | 20 | Requirements 21 | 22 | * Nextcloud 23 | * Nextcloud Passman App 24 | -------------------------------------------------------------------------------- /app/src/main/res/layout/progress_dialog.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 20 | 21 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /home/wolfi/Android/Sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # This is generated automatically by the Android Gradle plugin.-dontwarn org.conscrypt.Conscrypt$ProviderBuilder 20 | -dontwarn org.conscrypt.Conscrypt 21 | -------------------------------------------------------------------------------- /app/src/androidTest/java/es/wolfi/app/passman/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package es.wolfi.app.passman; 2 | 3 | import android.content.Context; 4 | import androidx.test.platform.app.InstrumentationRegistry; 5 | import androidx.test.ext.junit.runners.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 23 | 24 | assertEquals("es.wolfi.app.passman", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #0082c9 4 | #006AA3 5 | #007CC2 6 | #ffffff 7 | #000000 8 | 11 | @color/white 12 | #7fC0E3 13 | 14 | @color/colorAccent 15 | @color/white 16 | #D6D7D7 17 | @color/black 18 | 19 | #00000000 20 | #FF0000 21 | #36FF0000 22 | #7E4C819F 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/login_decision_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 21 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/java/es/wolfi/utils/Filterable.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Passman Android App 3 | * 4 | * @copyright Copyright (c) 2016, Sander Brand (brantje@gmail.com) 5 | * @copyright Copyright (c) 2016, Marcos Zuriaga Miguel (wolfi@wolfi.es) 6 | * @license GNU AGPL version 3 or any later version 7 | * 8 | * This program is free software: you can redistribute it and/or modify 9 | * it under the terms of the GNU Affero General Public License as 10 | * published by the Free Software Foundation, either version 3 of the 11 | * License, or (at your option) any later version. 12 | * 13 | * This program is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU Affero General Public License for more details. 17 | * 18 | * You should have received a copy of the GNU Affero General Public License 19 | * along with this program. If not, see . 20 | * 21 | */ 22 | 23 | package es.wolfi.utils; 24 | 25 | public interface Filterable { 26 | public String getFilterableAttribute(); 27 | } 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | app/.cxx 11 | app/release 12 | app/googlePlayRelease 13 | # Built application files 14 | *.apk 15 | *.ap_ 16 | output-metadata.json 17 | 18 | # Files for the ART/Dalvik VM 19 | *.dex 20 | 21 | # Java class files 22 | *.class 23 | 24 | # Generated files 25 | bin/ 26 | gen/ 27 | out/ 28 | 29 | # Gradle files 30 | .gradle/ 31 | build/ 32 | 33 | # Local configuration file (sdk path, etc) 34 | local.properties 35 | 36 | # Proguard folder generated by Eclipse 37 | proguard/ 38 | 39 | # Log Files 40 | *.log 41 | 42 | # Android Studio Navigation editor temp files 43 | .navigation/ 44 | 45 | # Android Studio captures folder 46 | captures/ 47 | 48 | # Intellij 49 | *.iml 50 | .idea/workspace.xml 51 | .idea/tasks.xml 52 | .idea/gradle.xml 53 | .idea/libraries 54 | 55 | # Keystore files 56 | *.jks 57 | 58 | # External native build folder generated in Android Studio 2.2 and later 59 | .externalNativeBuild 60 | 61 | # Google Services (e.g. APIs or Firebase) 62 | google-services.json 63 | 64 | Openssl.conf 65 | openssl.conf 66 | .idea/* 67 | 68 | gradle.properties 69 | -------------------------------------------------------------------------------- /gradle.properties.example: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | org.gradle.jvmargs=-Xmx1536m 13 | 14 | # When configured, Gradle will run in incubating parallel mode. 15 | # This option should only be used with decoupled projects. More details, visit 16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 17 | # org.gradle.parallel=true 18 | ALPHA_STORE=alpha/store/file/path 19 | ALPHA_STORE_PASSWORD=alpha store key 20 | ALPHA_KEY_ALIAS=beta 21 | ALPHA_KEY_PASSWORD=alpha key password 22 | RELEASE_STORE=/path/to/release/store 23 | RELEASE_STORE_PASSWORD=release store password 24 | RELEASE_KEY_ALIAS=release 25 | RELEASE_KEY_PASSWORD=release store key 26 | android.useAndroidX=true 27 | android.enableJetifier=true 28 | android.nonTransitiveRClass=false 29 | android.nonFinalResIds=false 30 | -------------------------------------------------------------------------------- /app/src/main/cpp/SJCL.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Passman Android App 3 | * 4 | * @copyright Copyright (c) 2016, Sander Brand (brantje@gmail.com) 5 | * @copyright Copyright (c) 2016, Marcos Zuriaga Miguel (wolfi@wolfi.es) 6 | * @license GNU AGPL version 3 or any later version 7 | * 8 | * This program is free software: you can redistribute it and/or modify 9 | * it under the terms of the GNU Affero General Public License as 10 | * published by the Free Software Foundation, either version 3 of the 11 | * License, or (at your option) any later version. 12 | * 13 | * This program is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU Affero General Public License for more details. 17 | * 18 | * You should have received a copy of the GNU Affero General Public License 19 | * along with this program. If not, see . 20 | * 21 | */ 22 | 23 | #include 24 | 25 | using namespace std; 26 | namespace WLF { 27 | namespace Crypto { 28 | class SJCL { 29 | public: 30 | static char* decrypt(string sjcl_json, string key); 31 | static char* encrypt(char* message, const string& key); 32 | }; 33 | } 34 | } -------------------------------------------------------------------------------- /app/src/main/java/es/wolfi/utils/otp/CodeGenerationException.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Passman Android App 3 | * 4 | * @copyright Copyright (c) 2021, Sander Brand (brantje@gmail.com) 5 | * @copyright Copyright (c) 2021, Marcos Zuriaga Miguel (wolfi@wolfi.es) 6 | * @copyright Copyright (c) 2024, Timo Triebensky (timo@binsky.org) 7 | * @license GNU AGPL version 3 or any later version 8 | *

9 | * This program is free software: you can redistribute it and/or modify 10 | * it under the terms of the GNU Affero General Public License as 11 | * published by the Free Software Foundation, either version 3 of the 12 | * License, or (at your option) any later version. 13 | *

14 | * This program is distributed in the hope that it will be useful, 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | * GNU Affero General Public License for more details. 18 | *

19 | * You should have received a copy of the GNU Affero General Public License 20 | * along with this program. If not, see . 21 | */ 22 | 23 | package es.wolfi.utils.otp; 24 | 25 | public class CodeGenerationException extends Exception { 26 | public CodeGenerationException(String message, Throwable cause) { 27 | super(message, cause); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/es/wolfi/app/passman/CallbackNames.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Passman Android App 3 | * 4 | * @copyright Copyright (c) 2016, Sander Brand (brantje@gmail.com) 5 | * @copyright Copyright (c) 2016, Marcos Zuriaga Miguel (wolfi@wolfi.es) 6 | * @license GNU AGPL version 3 or any later version 7 | * 8 | * This program is free software: you can redistribute it and/or modify 9 | * it under the terms of the GNU Affero General Public License as 10 | * published by the Free Software Foundation, either version 3 of the 11 | * License, or (at your option) any later version. 12 | * 13 | * This program is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU Affero General Public License for more details. 17 | * 18 | * You should have received a copy of the GNU Affero General Public License 19 | * along with this program. If not, see . 20 | * 21 | */ 22 | package es.wolfi.app.passman; 23 | 24 | 25 | 26 | public enum CallbackNames { 27 | LOGIN("login"), 28 | ; 29 | 30 | 31 | private final String name; 32 | 33 | CallbackNames(final String name) { 34 | this.name = name; 35 | } 36 | 37 | @Override 38 | public String toString() { 39 | return name; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/es/wolfi/app/passman/OfflineStorageValues.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Passman Android App 3 | * 4 | * @copyright Copyright (c) 2016, Sander Brand (brantje@gmail.com) 5 | * @copyright Copyright (c) 2016, Marcos Zuriaga Miguel (wolfi@wolfi.es) 6 | * @license GNU AGPL version 3 or any later version 7 | *

8 | * This program is free software: you can redistribute it and/or modify 9 | * it under the terms of the GNU Affero General Public License as 10 | * published by the Free Software Foundation, either version 3 of the 11 | * License, or (at your option) any later version. 12 | *

13 | * This program is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU Affero General Public License for more details. 17 | *

18 | * You should have received a copy of the GNU Affero General Public License 19 | * along with this program. If not, see . 20 | */ 21 | 22 | package es.wolfi.app.passman; 23 | 24 | public enum OfflineStorageValues { 25 | VAULTS("vaults"), 26 | VERSION("version"); 27 | 28 | private final String name; 29 | 30 | OfflineStorageValues(final String name) { 31 | this.name = name; 32 | } 33 | 34 | @Override 35 | public String toString() { 36 | return name; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/cpp/base64.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Passman Android App 3 | * 4 | * @copyright Copyright (c) 2016, Sander Brand (brantje@gmail.com) 5 | * @copyright Copyright (c) 2016, Marcos Zuriaga Miguel (wolfi@wolfi.es) 6 | * @license GNU AGPL version 3 or any later version 7 | * 8 | * This program is free software: you can redistribute it and/or modify 9 | * it under the terms of the GNU Affero General Public License as 10 | * published by the Free Software Foundation, either version 3 of the 11 | * License, or (at your option) any later version. 12 | * 13 | * This program is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU Affero General Public License for more details. 17 | * 18 | * You should have received a copy of the GNU Affero General Public License 19 | * along with this program. If not, see . 20 | * 21 | */ 22 | 23 | #ifndef BASE64_H 24 | #define BASE64_H 25 | 26 | #include 27 | 28 | namespace WLF { 29 | namespace Crypto { 30 | struct Datagram { 31 | unsigned char* data; 32 | int length; 33 | }; 34 | 35 | class BASE64{ 36 | 37 | public: 38 | static Datagram* encode(const unsigned char *str, int length); 39 | 40 | static Datagram* decode(const unsigned char *str, int length); 41 | }; 42 | 43 | } 44 | } 45 | 46 | #endif //PASSMAN_BASE64_H 47 | -------------------------------------------------------------------------------- /app/src/main/java/es/wolfi/passman/API/SharingACL.java: -------------------------------------------------------------------------------- 1 | package es.wolfi.passman.API; 2 | 3 | public class SharingACL { 4 | public enum PERMISSION { 5 | READ(0x01), 6 | WRITE(0x02), 7 | FILES(0x04), 8 | HISTORY(0x08), 9 | OWNER(0x80); 10 | 11 | final int permissionValue; 12 | 13 | PERMISSION(int value) { 14 | permissionValue = value; 15 | } 16 | 17 | public int permissionValue() { 18 | return permissionValue; 19 | } 20 | } 21 | 22 | private int permission; 23 | 24 | public SharingACL(int permission) { 25 | this.permission = permission; 26 | } 27 | 28 | /** 29 | * Checks if a user has the given permission/s. 30 | */ 31 | public boolean hasPermission(PERMISSION permission) { 32 | return permission.permissionValue == (this.permission & permission.permissionValue); 33 | } 34 | 35 | /** 36 | * Adds a permission to a user, leaving any other permissions intact. 37 | */ 38 | public void addPermission(PERMISSION permission) { 39 | this.permission = this.permission | permission.permissionValue; 40 | } 41 | 42 | /** 43 | * Removes a given permission from the item, leaving any other intact. 44 | */ 45 | public void removePermission(PERMISSION permission) { 46 | this.permission = this.permission & ~permission.permissionValue; 47 | } 48 | 49 | public int getPermission() { 50 | return this.permission; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /app/src/main/java/es/wolfi/utils/ListUtils.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Passman Android App 3 | * 4 | * @copyright Copyright (c) 2016, Sander Brand (brantje@gmail.com) 5 | * @copyright Copyright (c) 2016, Marcos Zuriaga Miguel (wolfi@wolfi.es) 6 | * @license GNU AGPL version 3 or any later version 7 | * 8 | * This program is free software: you can redistribute it and/or modify 9 | * it under the terms of the GNU Affero General Public License as 10 | * published by the Free Software Foundation, either version 3 of the 11 | * License, or (at your option) any later version. 12 | * 13 | * This program is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU Affero General Public License for more details. 17 | * 18 | * You should have received a copy of the GNU Affero General Public License 19 | * along with this program. If not, see . 20 | * 21 | */ 22 | 23 | package es.wolfi.utils; 24 | 25 | import java.util.ArrayList; 26 | import java.util.Iterator; 27 | 28 | public class ListUtils { 29 | public static ArrayList filterList(String filter, ArrayList list){ 30 | ArrayList copiedList = new ArrayList(list); 31 | Iterator it = copiedList.iterator(); 32 | while (it.hasNext()) { 33 | if (!it.next().getFilterableAttribute().contains(filter)) { 34 | it.remove(); 35 | } 36 | } 37 | return copiedList; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/res/layout/content_password_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 23 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/java/es/wolfi/utils/ColorUtils.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Passman Android App 3 | * 4 | * @copyright Copyright (c) 2017, Andy Scherzinger 5 | * @license GNU AGPL version 3 or any later version 6 | * 7 | * This program is free software: you can redistribute it and/or modify 8 | * it under the terms of the GNU Affero General Public License as 9 | * published by the Free Software Foundation, either version 3 of the 10 | * License, or (at your option) any later version. 11 | * 12 | * This program is distributed in the hope that it will be useful, 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | * GNU Affero General Public License for more details. 16 | * 17 | * You should have received a copy of the GNU Affero General Public License 18 | * along with this program. If not, see . 19 | * 20 | */ 21 | 22 | package es.wolfi.utils; 23 | 24 | import android.graphics.Color; 25 | 26 | /** 27 | * Util implementation for color calculations. 28 | */ 29 | public class ColorUtils { 30 | 31 | /** 32 | * calculates a color for a given name. 33 | * 34 | * @param name the name String 35 | * @return the calculated color 36 | */ 37 | public static int calculateColor(String name) { 38 | int hash = name.hashCode(); 39 | int r = (hash & 0xFF0000) >> 16; 40 | int g = (hash & 0x00FF00) >> 8; 41 | int b = hash & 0x0000FF; 42 | 43 | //pastelize color 44 | r = (r + 127) / 2; 45 | g = (g + 127) / 2; 46 | b = (b + 127) / 2; 47 | 48 | return Color.rgb(r, g, b); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /PRIVACY.md: -------------------------------------------------------------------------------- 1 | # Passman Android - Privacy Policy 2 | 3 | The "Passman" Android-App (in the following referred to as "App") does not collect or send any data from you or your device to a server of the developers or the [Nextcloud GmbH](https://nextcloud.com/). The App sends all data exclusively to the server(s) configured by you with the intention to synchronize the contents of the App with those of the server. This data can contain IP-addresses, timestamps and further information as meta data. 4 | Data entered into the app (e.g. when saving) is necessarily transferred to the configured server(s). This contents can also contain personal information depending on the use. The server(s) you configured are technically outside the access area of this App developers, so that we neither know nor can prevent what happens to your data there. Please consult the privacy policy of the respective server operator. 5 | 6 | ## Permissions 7 | 8 | This is a list of permissions required and asked by the App in order to properly work on your device: 9 | 10 | - `android.permission.INTERNET` 11 | 12 | Used to communicate with your Nextcloud instance and synchronize contents. 13 | 14 | - `android.permission.READ_EXTERNAL_STORAGE` 15 | 16 | Used to select and add files to a credential. 17 | 18 | - `android.permission.WRITE_EXTERNAL_STORAGE` 19 | 20 | Used to store downloaded files from a credential on your device. 21 | 22 | - `android.permission.BIND_AUTOFILL_SERVICE` 23 | 24 | Used to provide a autofill service for known access data. 25 | 26 | - `android.permission.CAMERA` 27 | 28 | Used to provide a QR code scanner for OTP editing. 29 | 30 | ## Nextcloud privacy policy 31 | 32 | You can get more information on Nextcloud general privacy policy which is accessible at [nextcloud.com/privacy](https://nextcloud.com/privacy/). 33 | -------------------------------------------------------------------------------- /app/src/main/res/layout/autofill_list_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 23 | 26 | 35 | -------------------------------------------------------------------------------- /app/src/main/java/es/wolfi/utils/JSONUtils.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Passman Android App 3 | * 4 | * @copyright Copyright (c) 2016, Sander Brand (brantje@gmail.com) 5 | * @copyright Copyright (c) 2016, Marcos Zuriaga Miguel (wolfi@wolfi.es) 6 | * @license GNU AGPL version 3 or any later version 7 | * 8 | * This program is free software: you can redistribute it and/or modify 9 | * it under the terms of the GNU Affero General Public License as 10 | * published by the Free Software Foundation, either version 3 of the 11 | * License, or (at your option) any later version. 12 | * 13 | * This program is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU Affero General Public License for more details. 17 | * 18 | * You should have received a copy of the GNU Affero General Public License 19 | * along with this program. If not, see . 20 | * 21 | */ 22 | 23 | package es.wolfi.utils; 24 | 25 | public class JSONUtils { 26 | /** 27 | * Checks if an string looks like a json object 28 | * @param text to check 29 | * @return true if it looks like a json object, false otherwise 30 | */ 31 | public static final boolean isJSONObject(String data){ 32 | if (data.length() == 0) return false; 33 | return data.charAt(0) == '{' && data.charAt(data.length() -1) == '}'; 34 | } 35 | 36 | /** 37 | * Check if an string seems like a json array 38 | * @param the text to check 39 | * @return true if it looks like an array, false otherwise 40 | */ 41 | public static final boolean isJSONArray(String data){ 42 | if (data.length() == 0) return false; 43 | return data.charAt(0) == '[' && data.charAt(data.length() -1) == ']'; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_credential_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 23 | 28 | 29 | 36 | 37 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_credential_file_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 23 | 28 | 29 | 36 | 37 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /app/src/main/java/es/wolfi/app/passman/autofill/AutofillFieldCollection.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Passman Android App 3 | * 4 | * @copyright Copyright (c) 2021, Sander Brand (brantje@gmail.com) 5 | * @copyright Copyright (c) 2021, Marcos Zuriaga Miguel (wolfi@wolfi.es) 6 | * @copyright Copyright (c) 2021, Timo Triebensky (timo@binsky.org) 7 | * @license GNU AGPL version 3 or any later version 8 | *

9 | * This program is free software: you can redistribute it and/or modify 10 | * it under the terms of the GNU Affero General Public License as 11 | * published by the Free Software Foundation, either version 3 of the 12 | * License, or (at your option) any later version. 13 | *

14 | * This program is distributed in the hope that it will be useful, 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | * GNU Affero General Public License for more details. 18 | *

19 | * You should have received a copy of the GNU Affero General Public License 20 | * along with this program. If not, see . 21 | */ 22 | 23 | package es.wolfi.app.passman.autofill; 24 | 25 | import java.util.ArrayList; 26 | import java.util.Collections; 27 | import java.util.List; 28 | 29 | public class AutofillFieldCollection extends ArrayList { 30 | public AutofillField getRequiredId(String hint) { 31 | // Order: Android Hint, HTMLInfo, View Hint, Resource id 32 | // Focused First 33 | 34 | Collections.sort(this); 35 | 36 | for (AutofillField field : this) { 37 | if (field.hasHint(hint)) { 38 | return field; 39 | } 40 | } 41 | return null; 42 | } 43 | 44 | public List getOptionalIds(String hint) { 45 | // Order: Android Hint, View Hint, HTMLInfo, Resource id 46 | // Focused First 47 | // Excludes requiredIds 48 | List allMatching = new ArrayList<>(); 49 | 50 | Collections.sort(this); 51 | 52 | for (AutofillField field : this) { 53 | if (field.hasHint(hint)) { 54 | allMatching.add(field); 55 | } 56 | } 57 | allMatching.remove(getRequiredId(hint)); 58 | 59 | return allMatching; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/res/layout/autofill_list_item_with_icon.xml: -------------------------------------------------------------------------------- 1 | 2 | 23 | 26 | 27 | 39 | 48 | -------------------------------------------------------------------------------- /app/src/main/java/es/wolfi/app/passman/SettingValues.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Passman Android App 3 | * 4 | * @copyright Copyright (c) 2016, Sander Brand (brantje@gmail.com) 5 | * @copyright Copyright (c) 2016, Marcos Zuriaga Miguel (wolfi@wolfi.es) 6 | * @license GNU AGPL version 3 or any later version 7 | *

8 | * This program is free software: you can redistribute it and/or modify 9 | * it under the terms of the GNU Affero General Public License as 10 | * published by the Free Software Foundation, either version 3 of the 11 | * License, or (at your option) any later version. 12 | *

13 | * This program is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU Affero General Public License for more details. 17 | *

18 | * You should have received a copy of the GNU Affero General Public License 19 | * along with this program. If not, see . 20 | */ 21 | 22 | package es.wolfi.app.passman; 23 | 24 | public enum SettingValues { 25 | HOST("host"), 26 | USER("user"), 27 | PASSWORD("password"), 28 | VAULTS("vaults"), 29 | ACTIVE_VAULT("active_vault"), 30 | AUTOFILL_VAULT_GUID("autofill_vault_guid"), 31 | AUTOFILL_VAULT("autofill_vault"), 32 | ENABLE_AUTOFILL_MANUAL_SEARCH_FALLBACK("enable_autofill_manual_search_fallback"), 33 | ENABLE_APP_START_DEVICE_PASSWORD("enable_app_start_device_password"), 34 | ENABLE_CREDENTIAL_LIST_ICONS("enable_credential_list_icons"), 35 | REQUEST_CONNECT_TIMEOUT("request_connect_timeout"), 36 | REQUEST_RESPONSE_TIMEOUT("request_response_timeout"), 37 | CLEAR_CLIPBOARD_DELAY("clear_clipboard_delay"), 38 | PASSWORD_GENERATOR_SETTINGS("password_generator_settings"), 39 | ENABLE_PASSWORD_GENERATOR_SHORTCUT("enable_password_generator_shortcut"), 40 | OFFLINE_STORAGE("offline_storage"), 41 | ENABLE_OFFLINE_CACHE("enable_offline_cache"), 42 | KEY_STORE_MIGRATION_STATE("key_store_migration_state"), 43 | KEY_STORE_ENCRYPTION_KEY("key_store_encryption_key"); 44 | 45 | private final String name; 46 | 47 | SettingValues(final String name) { 48 | this.name = name; 49 | } 50 | 51 | @Override 52 | public String toString() { 53 | return name; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /app/src/main/java/es/wolfi/utils/CredentialLabelSort.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Passman Android App 3 | * 4 | * @copyright Copyright (c) 2021, Sander Brand (brantje@gmail.com) 5 | * @copyright Copyright (c) 2021, Marcos Zuriaga Miguel (wolfi@wolfi.es) 6 | * @copyright Copyright (c) 2021, Timo Triebensky (timo@binsky.org) 7 | * @license GNU AGPL version 3 or any later version 8 | *

9 | * This program is free software: you can redistribute it and/or modify 10 | * it under the terms of the GNU Affero General Public License as 11 | * published by the Free Software Foundation, either version 3 of the 12 | * License, or (at your option) any later version. 13 | *

14 | * This program is distributed in the hope that it will be useful, 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | * GNU Affero General Public License for more details. 18 | *

19 | * You should have received a copy of the GNU Affero General Public License 20 | * along with this program. If not, see . 21 | */ 22 | 23 | package es.wolfi.utils; 24 | 25 | import java.util.Comparator; 26 | 27 | import es.wolfi.passman.API.Credential; 28 | 29 | /** 30 | * Created by wolfi on 12/11/17. 31 | */ 32 | 33 | public class CredentialLabelSort implements Comparator { 34 | 35 | /** 36 | * credential sort methods: 37 | * description code 38 | *

39 | * default server sort 0 40 | * alphabetically ascending 1 41 | * alphabetically descending 2 42 | */ 43 | public enum SortMethod { 44 | STANDARD, ALPHABETICALLY_ASCENDING, ALPHABETICALLY_DESCENDING 45 | } 46 | 47 | private final int method; 48 | 49 | public CredentialLabelSort(int method) { 50 | this.method = method; 51 | } 52 | 53 | @Override 54 | public int compare(Credential left, Credential right) { 55 | if (method == SortMethod.ALPHABETICALLY_ASCENDING.ordinal()) { 56 | return left.getLabel().compareTo(right.getLabel()); 57 | } 58 | if (method == SortMethod.ALPHABETICALLY_DESCENDING.ordinal()) { 59 | return right.getLabel().compareTo(left.getLabel()); 60 | } 61 | return left.getId() - right.getId(); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /app/src/main/java/es/wolfi/app/passman/SJCLCrypto.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Passman Android App 3 | * 4 | * @copyright Copyright (c) 2016, Sander Brand (brantje@gmail.com) 5 | * @copyright Copyright (c) 2016, Marcos Zuriaga Miguel (wolfi@wolfi.es) 6 | * @license GNU AGPL version 3 or any later version 7 | *

8 | * This program is free software: you can redistribute it and/or modify 9 | * it under the terms of the GNU Affero General Public License as 10 | * published by the Free Software Foundation, either version 3 of the 11 | * License, or (at your option) any later version. 12 | *

13 | * This program is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU Affero General Public License for more details. 17 | *

18 | * You should have received a copy of the GNU Affero General Public License 19 | * along with this program. If not, see . 20 | */ 21 | package es.wolfi.app.passman; 22 | 23 | import android.util.Base64; 24 | 25 | import com.google.gson.Gson; 26 | 27 | import java.nio.charset.StandardCharsets; 28 | 29 | public class SJCLCrypto { 30 | public static native String decryptStringCpp(String cryptogram, String key) throws Exception; 31 | 32 | public static native String encryptStringCpp(String plaintext, String key) throws Exception; 33 | 34 | public static String decryptString(String input, String password) throws Exception { 35 | String output = new String(android.util.Base64.decode(decryptStringCpp(input, password), Base64.DEFAULT), StandardCharsets.UTF_8); 36 | 37 | if (output.length() > 0) { 38 | try { 39 | Gson g = new Gson(); 40 | return g.fromJson(output, String.class); 41 | } catch (Exception egson) { 42 | return output; 43 | } 44 | } 45 | 46 | return output; 47 | } 48 | 49 | public static String encryptString(String input, String password, boolean asJsonString) throws Exception { 50 | if (asJsonString) { 51 | Gson g = new Gson(); 52 | input = g.toJson(input); 53 | } 54 | 55 | return encryptStringCpp(input, password); 56 | } 57 | 58 | static { 59 | System.loadLibrary("passman-lib"); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_edit_password_text_item.xml: -------------------------------------------------------------------------------- 1 | 23 | 26 | 27 | 36 | 37 | 45 | 46 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /app/src/main/java/es/wolfi/passman/API/CredentialACL.java: -------------------------------------------------------------------------------- 1 | package es.wolfi.passman.API; 2 | 3 | import org.json.JSONException; 4 | import org.json.JSONObject; 5 | 6 | public class CredentialACL { 7 | protected int acl_id; 8 | protected int item_id; 9 | protected String item_guid; 10 | protected String user_id; 11 | protected int created; 12 | protected int expire; 13 | protected int expire_views; 14 | protected SharingACL permissions; 15 | protected int vault_id; 16 | protected String vault_guid; 17 | protected String shared_key; // encrypted field 18 | protected boolean pending; 19 | 20 | public SharingACL getPermissions() { 21 | return permissions; 22 | } 23 | 24 | public static CredentialACL fromJSON(JSONObject o) throws JSONException { 25 | CredentialACL acl = new CredentialACL(); 26 | acl.acl_id = o.getInt("acl_id"); 27 | acl.item_id = o.getInt("item_id"); 28 | acl.item_guid = o.getString("item_guid"); 29 | acl.user_id = o.getString("user_id"); 30 | acl.created = o.getInt("created"); 31 | acl.expire = o.getInt("expire"); 32 | acl.expire_views = o.getInt("expire_views"); 33 | acl.vault_id = o.getInt("vault_id"); 34 | acl.vault_guid = o.getString("vault_guid"); 35 | acl.shared_key = o.getString("shared_key"); 36 | acl.pending = o.getBoolean("pending"); 37 | acl.permissions = new SharingACL(o.getInt("permissions")); 38 | return acl; 39 | } 40 | 41 | public JSONObject getAsJSONObject() throws JSONException { 42 | JSONObject params = new JSONObject(); 43 | 44 | JSONObject permissions = null; 45 | 46 | try { 47 | permissions = new JSONObject(); 48 | permissions.put("permission", this.permissions.getPermission()); 49 | } catch (JSONException e) { 50 | e.printStackTrace(); 51 | } 52 | 53 | params.put("acl_id", acl_id); 54 | params.put("item_id", item_id); 55 | params.put("item_guid", item_guid); 56 | params.put("user_id", user_id); 57 | params.put("created", created); 58 | params.put("expire", expire); 59 | params.put("expire_views", expire_views); 60 | params.put("vault_id", vault_id); 61 | params.put("vault_guid", vault_guid); 62 | params.put("shared_key", shared_key); 63 | params.put("permissions", permissions); 64 | params.put("pending", pending ? 1 : 0); 65 | 66 | return params; 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /app/src/main/java/es/wolfi/utils/SSOUtils.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Passman Android App 3 | * 4 | * @copyright Copyright (c) 2022, Timo Triebensky (timo@binsky.org) 5 | * @license GNU AGPL version 3 or any later version 6 | *

7 | * This program is free software: you can redistribute it and/or modify 8 | * it under the terms of the GNU Affero General Public License as 9 | * published by the Free Software Foundation, either version 3 of the 10 | * License, or (at your option) any later version. 11 | *

12 | * This program is distributed in the hope that it will be useful, 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | * GNU Affero General Public License for more details. 16 | *

17 | * You should have received a copy of the GNU Affero General Public License 18 | * along with this program. If not, see . 19 | */ 20 | 21 | package es.wolfi.utils; 22 | 23 | import android.content.Context; 24 | import android.content.pm.PackageInfo; 25 | import android.content.pm.PackageManager; 26 | 27 | import java.util.Arrays; 28 | import java.util.List; 29 | 30 | /** 31 | * Utils for Nextcloud files app based SSO 32 | */ 33 | public class SSOUtils { 34 | 35 | /** 36 | * Checks whether a supported Nextcloud files app is installed or not. 37 | * 38 | * @param context Context to get packageManager 39 | * @return whether a supported Nextcloud files app is installed or not 40 | */ 41 | public static boolean isNextcloudFilesAppInstalled(Context context) { 42 | final String PROD_PACKAGE_ID = "com.nextcloud.client"; 43 | final String BETA_PACKAGE_ID = "com.nextcloud.android.beta"; 44 | List APPS = Arrays.asList(PROD_PACKAGE_ID, BETA_PACKAGE_ID); 45 | 46 | PackageManager pm = context.getPackageManager(); 47 | for (String app : APPS) { 48 | try { 49 | PackageInfo pi = pm.getPackageInfo(app, PackageManager.GET_ACTIVITIES); 50 | // Nextcloud Files app version 30180090 is required by the used SSO library 51 | if ((pi.versionCode >= 30180090 && pi.packageName.equals("com.nextcloud.client")) || 52 | pi.versionCode >= 20211118 && pi.packageName.equals("com.nextcloud.android.beta")) { 53 | return true; 54 | } 55 | } catch (PackageManager.NameNotFoundException ignored) { 56 | } 57 | } 58 | return false; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /app/src/main/java/es/wolfi/utils/QrCodeAnalyzer.java: -------------------------------------------------------------------------------- 1 | package es.wolfi.utils; 2 | 3 | import androidx.annotation.NonNull; 4 | import androidx.camera.core.ImageAnalysis; 5 | import androidx.camera.core.ImageProxy; 6 | 7 | import com.google.zxing.BinaryBitmap; 8 | import com.google.zxing.ChecksumException; 9 | import com.google.zxing.FormatException; 10 | import com.google.zxing.NotFoundException; 11 | import com.google.zxing.PlanarYUVLuminanceSource; 12 | import com.google.zxing.Result; 13 | import com.google.zxing.common.HybridBinarizer; 14 | import com.google.zxing.qrcode.QRCodeReader; 15 | import com.koushikdutta.async.future.FutureCallback; 16 | 17 | import java.nio.ByteBuffer; 18 | 19 | public class QrCodeAnalyzer implements ImageAnalysis.Analyzer { 20 | 21 | public final static String LOG_TAG = QrCodeAnalyzer.class.getSimpleName(); 22 | 23 | private final QRCodeReader qrCodeReader = new QRCodeReader(); 24 | private final FutureCallback callback; 25 | private boolean foundToken = false; 26 | 27 | public QrCodeAnalyzer(FutureCallback callback) { 28 | this.callback = callback; 29 | } 30 | 31 | @Override 32 | public void analyze(@NonNull ImageProxy image) { 33 | if (foundToken) { 34 | return; 35 | } 36 | 37 | Result result = null; 38 | Exception exception = null; 39 | 40 | ByteBuffer buffer = image.getPlanes()[0].getBuffer(); 41 | 42 | byte[] imageData = new byte[buffer.remaining()]; 43 | buffer.get(imageData); 44 | 45 | PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource( 46 | imageData, 47 | image.getWidth(), 48 | image.getHeight(), 49 | 0, 50 | 0, 51 | image.getWidth(), 52 | image.getHeight(), 53 | false 54 | ); 55 | 56 | try { 57 | result = qrCodeReader.decode(new BinaryBitmap(new HybridBinarizer(source))); 58 | foundToken = true; 59 | } catch (NotFoundException | ChecksumException ignored) { 60 | // Whenever reader fails to detect a QR code in image it throws NotFoundException 61 | // Whenever reader detect a QR code with inconsistent QR points it throws ChecksumException 62 | } catch (FormatException e) { 63 | exception = e; 64 | } finally { 65 | qrCodeReader.reset(); 66 | } 67 | 68 | image.close(); 69 | callback.onCompleted(exception, result); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /app/src/main/java/es/wolfi/utils/otp/Base32Decoder.java: -------------------------------------------------------------------------------- 1 | package es.wolfi.utils.otp; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | public class Base32Decoder { 7 | // Standard Base32 alphabet (RFC 4648) 8 | private static final String BASE32_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; 9 | private static final Map DECODE_MAP = new HashMap<>(); 10 | 11 | static { 12 | // Build the decode map 13 | for (int i = 0; i < BASE32_ALPHABET.length(); i++) { 14 | DECODE_MAP.put(BASE32_ALPHABET.charAt(i), i); 15 | } 16 | } 17 | 18 | /** 19 | * Decodes a Base32 encoded string to bytes 20 | * 21 | * @param encoded The Base32 encoded string 22 | * @return The decoded bytes 23 | * @throws IllegalArgumentException if the input is invalid 24 | */ 25 | public static byte[] decodeBase32(String encoded) { 26 | if (encoded == null || encoded.isEmpty()) { 27 | return new byte[0]; 28 | } 29 | 30 | // Remove padding and convert to uppercase 31 | encoded = encoded.toUpperCase().replaceAll("=", ""); 32 | 33 | // Validate input length 34 | if (encoded.isEmpty()) { 35 | return new byte[0]; 36 | } 37 | 38 | // Calculate output length 39 | int outputLength = (encoded.length() * 5) / 8; 40 | byte[] output = new byte[outputLength]; 41 | 42 | int bits = 0; 43 | int value = 0; 44 | int index = 0; 45 | 46 | for (char c : encoded.toCharArray()) { 47 | Integer charValue = DECODE_MAP.get(c); 48 | if (charValue == null) { 49 | throw new IllegalArgumentException("Invalid Base32 character: " + c); 50 | } 51 | 52 | value = (value << 5) | charValue; 53 | bits += 5; 54 | 55 | if (bits >= 8) { 56 | output[index++] = (byte) ((value >>> (bits - 8)) & 0xFF); 57 | bits -= 8; 58 | } 59 | } 60 | 61 | return output; 62 | } 63 | 64 | /** 65 | * Decodes a Base32 encoded string to a UTF-8 string 66 | * 67 | * @param encoded The Base32 encoded string 68 | * @return The decoded string 69 | * @throws IllegalArgumentException if the input is invalid 70 | */ 71 | public static String decodeBase32ToString(String encoded) { 72 | byte[] decoded = decodeBase32(encoded); 73 | return new String(decoded, java.nio.charset.StandardCharsets.UTF_8); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_vault_list.xml: -------------------------------------------------------------------------------- 1 | 23 | 29 | 30 | 41 | 42 | 43 | 44 | 52 | 53 | -------------------------------------------------------------------------------- /app/src/main/java/es/wolfi/utils/otp/HashingAlgorithm.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Passman Android App 3 | * 4 | * @copyright Copyright (c) 2021, Sander Brand (brantje@gmail.com) 5 | * @copyright Copyright (c) 2021, Marcos Zuriaga Miguel (wolfi@wolfi.es) 6 | * @copyright Copyright (c) 2024, Timo Triebensky (timo@binsky.org) 7 | * @license GNU AGPL version 3 or any later version 8 | *

9 | * This program is free software: you can redistribute it and/or modify 10 | * it under the terms of the GNU Affero General Public License as 11 | * published by the Free Software Foundation, either version 3 of the 12 | * License, or (at your option) any later version. 13 | *

14 | * This program is distributed in the hope that it will be useful, 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | * GNU Affero General Public License for more details. 18 | *

19 | * You should have received a copy of the GNU Affero General Public License 20 | * along with this program. If not, see . 21 | */ 22 | 23 | package es.wolfi.utils.otp; 24 | 25 | public enum HashingAlgorithm { 26 | SHA1("HmacSHA1", "SHA1"), 27 | SHA256("HmacSHA256", "SHA256"), 28 | SHA512("HmacSHA512", "SHA512"); 29 | 30 | public static final String[] hashingAlgorithmsFriendlyArray = new String[]{ 31 | HashingAlgorithm.SHA1.getFriendlyName(), 32 | HashingAlgorithm.SHA256.getFriendlyName(), 33 | HashingAlgorithm.SHA512.getFriendlyName() 34 | }; 35 | 36 | private final String hmacAlgorithm; 37 | private final String friendlyName; 38 | 39 | HashingAlgorithm(String hmacAlgorithm, String friendlyName) { 40 | this.hmacAlgorithm = hmacAlgorithm; 41 | this.friendlyName = friendlyName; 42 | } 43 | 44 | public String getHmacAlgorithm() { 45 | return hmacAlgorithm; 46 | } 47 | 48 | public String getFriendlyName() { 49 | return friendlyName; 50 | } 51 | 52 | /** 53 | * Parse input text into HashingAlgorithm. Returns HashingAlgorithm.SHA1 as fallback. 54 | */ 55 | public static HashingAlgorithm fromStringOrSha1(String friendlyNameInput) { 56 | HashingAlgorithm algorithm = HashingAlgorithm.SHA1; 57 | if (friendlyNameInput.equalsIgnoreCase(HashingAlgorithm.SHA256.friendlyName)) { 58 | algorithm = HashingAlgorithm.SHA256; 59 | } else if (friendlyNameInput.equalsIgnoreCase(HashingAlgorithm.SHA512.friendlyName)) { 60 | algorithm = HashingAlgorithm.SHA512; 61 | } 62 | return algorithm; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_copy_text_item.xml: -------------------------------------------------------------------------------- 1 | 22 | 25 | 26 | 36 | 37 | 44 | 45 | 52 | 53 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /app/src/main/java/es/wolfi/app/passman/SingleTon.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Passman Android App 3 | * 4 | * @copyright Copyright (c) 2016, Sander Brand (brantje@gmail.com) 5 | * @copyright Copyright (c) 2016, Marcos Zuriaga Miguel (wolfi@wolfi.es) 6 | * @license GNU AGPL version 3 or any later version 7 | * 8 | * This program is free software: you can redistribute it and/or modify 9 | * it under the terms of the GNU Affero General Public License as 10 | * published by the Free Software Foundation, either version 3 of the 11 | * License, or (at your option) any later version. 12 | * 13 | * This program is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU Affero General Public License for more details. 17 | * 18 | * You should have received a copy of the GNU Affero General Public License 19 | * along with this program. If not, see . 20 | * 21 | */ 22 | package es.wolfi.app.passman; 23 | import android.view.View; 24 | import java.util.concurrent.ConcurrentHashMap; 25 | 26 | 27 | public class SingleTon { 28 | protected final static SingleTon _ton = new SingleTon(); 29 | 30 | protected ConcurrentHashMap _click; 31 | protected ConcurrentHashMap _extra; 32 | protected ConcurrentHashMap _string; 33 | 34 | public SingleTon(){ 35 | _string = new ConcurrentHashMap(); 36 | _click = new ConcurrentHashMap(); 37 | _extra = new ConcurrentHashMap(); 38 | } 39 | 40 | public void addClickListener(String name, View.OnClickListener action){ 41 | _click.put(name, action); 42 | } 43 | 44 | public void addString(String name, String value){ 45 | _string.put(name, value); 46 | } 47 | 48 | public String getString(String name){ 49 | return _string.get(name); 50 | } 51 | 52 | public void addExtra(String name, Object data){ 53 | _extra.put(name, data); 54 | } 55 | public void removeExtra(String name){ 56 | _extra.remove(name); 57 | } 58 | 59 | public void removeString(String name){ 60 | _string.remove(name); 61 | } 62 | 63 | public View.OnClickListener getClickListener(String name){ 64 | return _click.get(name); 65 | } 66 | 67 | public Object getExtra(String name){ 68 | return _extra.get(name); 69 | } 70 | 71 | public final static SingleTon getTon(){ 72 | return _ton; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /app/src/main/res/values-ja-rJP/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 設定 3 | 同期 4 | サーバーアドレス 5 | ユーザー名 6 | パスワード 7 | 接続 8 | NextcloudのURLが間違っているか、接続できない 9 | 設定に誤りがあります 10 | ネットワークエラー 11 | 解除 12 | 保管庫パスワードが間違っています! 13 | ラベル 14 | メール 15 | URL 16 | 説明 17 | クリップボードにコピーしました 18 | 保管庫パスワード 19 | 保管庫パスワードを保存 20 | 未実装です 21 | 作成: 22 | 最終アクセス: 23 | 検索 24 | 保存 25 | 保存しました 26 | エラーが発生しました 27 | 更新 28 | アップデートに成功しました 29 | 削除 30 | 削除に成功しました 31 | アプリ設定 32 | 読み込み中です。お待​​ちください… 33 | 読み込み中 34 | ファイル 35 | ファイルを追加 36 | Passmanをアンロック 37 | エキスパート設定 38 | はい 39 | キャンセル 40 | パスワードを生成する 41 | すべての文字種を必須にする 42 | あいまいな文字を避ける 43 | 特殊文字を使用する 44 | パスワードの長さ 45 | 新しい保管庫の名前 46 | オフラインキャッシュ 47 | Nextcloud シングルサインオン 48 | 49 | FAQ 50 | シークレットキー 51 | 発行者 52 | 53 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /app/src/main/java/es/wolfi/app/passman/activities/ShortcutActivity.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Passman Android App 3 | * 4 | * @copyright Copyright (c) 2016, Sander Brand (brantje@gmail.com) 5 | * @copyright Copyright (c) 2016, Marcos Zuriaga Miguel (wolfi@wolfi.es) 6 | * @license GNU AGPL version 3 or any later version 7 | *

8 | * This program is free software: you can redistribute it and/or modify 9 | * it under the terms of the GNU Affero General Public License as 10 | * published by the Free Software Foundation, either version 3 of the 11 | * License, or (at your option) any later version. 12 | *

13 | * This program is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU Affero General Public License for more details. 17 | *

18 | * You should have received a copy of the GNU Affero General Public License 19 | * along with this program. If not, see . 20 | */ 21 | package es.wolfi.app.passman.activities; 22 | 23 | import android.content.ClipData; 24 | import android.content.ClipboardManager; 25 | import android.content.Context; 26 | import android.os.Bundle; 27 | import android.widget.Toast; 28 | 29 | import androidx.appcompat.app.AppCompatActivity; 30 | 31 | import es.wolfi.app.passman.R; 32 | import es.wolfi.utils.PasswordGenerator; 33 | 34 | public class ShortcutActivity extends AppCompatActivity { 35 | public final static String LOG_TAG = "ShortcutActivity"; 36 | public final static String GENERATE_PASSWORD_ID = "es.wolfi.app.passman.generate_password"; 37 | public final static String GENERATE_PASSWORD_INTENT_ACTION = "custom.actions.intent.GENERATE_PASSWORD"; 38 | 39 | @Override 40 | protected void onCreate(Bundle savedInstanceState) { 41 | super.onCreate(savedInstanceState); 42 | 43 | if (getIntent().getAction().equals(GENERATE_PASSWORD_INTENT_ACTION)) { 44 | generatePassword(); 45 | } 46 | 47 | finish(); 48 | } 49 | 50 | protected void generatePassword() { 51 | String password = new PasswordGenerator(getApplicationContext()).generateRandomPassword(); 52 | 53 | if (password != null && password.length() > 0) { 54 | ClipboardManager clipboard = (ClipboardManager) getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE); 55 | ClipData clip = ClipData.newPlainText("generated_password", password); 56 | clipboard.setPrimaryClip(clip); 57 | 58 | Toast.makeText(getApplicationContext(), R.string.copied_to_clipboard, Toast.LENGTH_SHORT).show(); 59 | return; 60 | } 61 | Toast.makeText(getApplicationContext(), R.string.error_occurred, Toast.LENGTH_SHORT).show(); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /app/src/main/java/es/wolfi/utils/ProgressUtils.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Passman Android App 3 | * 4 | * @copyright Copyright (c) 2021, Sander Brand (brantje@gmail.com) 5 | * @copyright Copyright (c) 2021, Marcos Zuriaga Miguel (wolfi@wolfi.es) 6 | * @copyright Copyright (c) 2021, Timo Triebensky (timo@binsky.org) 7 | * @license GNU AGPL version 3 or any later version 8 | *

9 | * This program is free software: you can redistribute it and/or modify 10 | * it under the terms of the GNU Affero General Public License as 11 | * published by the Free Software Foundation, either version 3 of the 12 | * License, or (at your option) any later version. 13 | *

14 | * This program is distributed in the hope that it will be useful, 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | * GNU Affero General Public License for more details. 18 | *

19 | * You should have received a copy of the GNU Affero General Public License 20 | * along with this program. If not, see . 21 | */ 22 | 23 | package es.wolfi.utils; 24 | 25 | import android.app.ProgressDialog; 26 | import android.content.Context; 27 | 28 | import es.wolfi.app.passman.R; 29 | 30 | public class ProgressUtils { 31 | /** 32 | * Creates and starts a unified loading sequence dialog 33 | * 34 | * @param context App context from view 35 | * @return ProgressDialog required to dismiss the dialog 36 | */ 37 | public static ProgressDialog showLoadingSequence(Context context) { 38 | return show(context, context.getString(R.string.loading), context.getString(R.string.wait_while_loading), false); 39 | } 40 | 41 | /** 42 | * Creates and starts a custom progress dialog 43 | * 44 | * @param context App context from view 45 | * @param title Progress dialog title 46 | * @param message Progress dialog message 47 | * @param cancelable Set if the dialog should be cancelable by the user 48 | * @return ProgressDialog required to dismiss the dialog 49 | */ 50 | public static ProgressDialog show(Context context, String title, String message, boolean cancelable) { 51 | final ProgressDialog progress = new ProgressDialog(context); 52 | progress.setTitle(title); 53 | progress.setMessage(message); 54 | progress.setCancelable(cancelable); 55 | progress.show(); 56 | 57 | return progress; 58 | } 59 | 60 | /** 61 | * Checks if a dialog is shown and calls dismiss() on it if possible 62 | * 63 | * @param progress progress dialog to dismiss 64 | */ 65 | public static void dismiss(ProgressDialog progress) { 66 | if (progress != null) { 67 | if (progress.isShowing()) { 68 | progress.dismiss(); 69 | } 70 | } 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /app/src/main/res/layout/content_sso_settings.xml: -------------------------------------------------------------------------------- 1 | 22 | 25 | 26 | 31 | 32 | 37 | 38 | 43 | 44 | 48 | 49 | 55 | 56 |