diff --git a/CredentialManager/app/build.gradle b/CredentialManager/app/build.gradle index 3399850..afd26fa 100644 --- a/CredentialManager/app/build.gradle +++ b/CredentialManager/app/build.gradle @@ -1,3 +1,19 @@ +/* + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' @@ -7,13 +23,10 @@ repositories { mavenCentral() } -// Create a variable called keystorePropertiesFile, and initialize it to your -// keystore.properties file, in the rootProject folder. +// Load keystore properties for our signing key +// (see developer.android.com/studio/publish/app-signing) def keystorePropertiesFile = rootProject.file("keystore.properties") - def keystoreProperties = new Properties() - -// Load keystore properties for our signing key (see developer.android.com/studio/publish/app-signing) keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) android { diff --git a/CredentialManager/app/src/main/AndroidManifest.xml b/CredentialManager/app/src/main/AndroidManifest.xml index ef5c4a2..6b9638a 100644 --- a/CredentialManager/app/src/main/AndroidManifest.xml +++ b/CredentialManager/app/src/main/AndroidManifest.xml @@ -1,4 +1,20 @@ + + diff --git a/CredentialManager/app/src/main/assets/RegFromServer b/CredentialManager/app/src/main/assets/RegFromServer index a51f712..469c45a 100644 --- a/CredentialManager/app/src/main/assets/RegFromServer +++ b/CredentialManager/app/src/main/assets/RegFromServer @@ -1,5 +1,5 @@ { - "challenge": "$4", + "challenge": "", "rp": { "id": "passkeys-codelab.glitch.me", "name": "CredMan App Test" @@ -19,8 +19,8 @@ "residentKey": "required" }, "user": { - "id": "$3", - "name": "$1", - "displayName": "$2" + "id": "", + "name": "", + "displayName": "" } } diff --git a/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/DataProvider.kt b/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/DataProvider.kt index 0312edc..9ccb42b 100644 --- a/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/DataProvider.kt +++ b/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/DataProvider.kt @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright 2023 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,7 +29,8 @@ object DataProvider { private const val PREF_NAME = "CREDMAN_PREF" fun initSharedPref(context: Context) { - sharedPreference = context.applicationContext.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE) + sharedPreference = + context.applicationContext.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE) editor = sharedPreference.edit() } diff --git a/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/Extensions.kt b/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/Extensions.kt index afa35b9..ae92370 100644 --- a/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/Extensions.kt +++ b/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/Extensions.kt @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright 2023 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,4 +35,3 @@ fun Context.showErrorAlert(msg: String) { .setIcon(android.R.drawable.ic_dialog_alert) .show() } - diff --git a/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/HomeFragment.kt b/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/HomeFragment.kt index ddf5130..6843c61 100644 --- a/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/HomeFragment.kt +++ b/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/HomeFragment.kt @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright 2023 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/MainActivity.kt b/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/MainActivity.kt index 997d60a..8c5c51f 100644 --- a/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/MainActivity.kt +++ b/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/MainActivity.kt @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright 2023 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -56,12 +56,12 @@ class MainActivity : AppCompatActivity(), MainFragmentCallback, HomeFragmentCall } override fun logout() { - supportFragmentManager.popBackStack("home", FragmentManager.POP_BACK_STACK_INCLUSIVE); + supportFragmentManager.popBackStack("home", FragmentManager.POP_BACK_STACK_INCLUSIVE) loadMainFragment() } private fun loadMainFragment() { - supportFragmentManager.popBackStack(); + supportFragmentManager.popBackStack() loadFragment(MainFragment(), false) } @@ -80,7 +80,7 @@ class MainActivity : AppCompatActivity(), MainFragmentCallback, HomeFragmentCall if (DataProvider.isSignedIn() || supportFragmentManager.backStackEntryCount == 1) { finish() } else { - super.onBackPressed(); + super.onBackPressed() } } } diff --git a/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/MainFragment.kt b/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/MainFragment.kt index 71f8bc3..5a36663 100644 --- a/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/MainFragment.kt +++ b/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/MainFragment.kt @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright 2023 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/SignInFragment.kt b/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/SignInFragment.kt index b1e3a39..922b988 100644 --- a/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/SignInFragment.kt +++ b/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/SignInFragment.kt @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright 2023 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -106,34 +106,36 @@ class SignInFragment : Fragment() { val getPublicKeyCredentialOption = GetPublicKeyCredentialOption(fetchAuthJsonFromServer(), null, true) val getPasswordOption = GetPasswordOption() - try { - val result = credentialManager.getCredential( + val result = try { + credentialManager.getCredential( GetCredentialRequest( listOf( getPublicKeyCredentialOption, getPasswordOption ) - ), requireActivity() + ), + requireActivity() ) - - if (result.credential is PublicKeyCredential) { - val cred = result.credential as PublicKeyCredential - DataProvider.setSignedInThroughPasskeys(true) - return "Passkey: ${cred.authenticationResponseJson}" - } - if (result.credential is PasswordCredential) { - val cred = result.credential as PasswordCredential - DataProvider.setSignedInThroughPasskeys(false) - return "Got Password - User:${cred.id} Password: ${cred.password}" - } } catch (e: Exception) { configureViews(View.INVISIBLE, true) - Log.e("Auth", " Exception Message" + e.message.toString()) + Log.e("Auth", "getCredential failed with exception: " + e.message.toString()) activity?.showErrorAlert( "An error occurred while authenticating through saved credentials. Check logs for additional details" ) return null } + + if (result.credential is PublicKeyCredential) { + val cred = result.credential as PublicKeyCredential + DataProvider.setSignedInThroughPasskeys(true) + return "Passkey: ${cred.authenticationResponseJson}" + } + if (result.credential is PasswordCredential) { + val cred = result.credential as PasswordCredential + DataProvider.setSignedInThroughPasskeys(false) + return "Got Password - User:${cred.id} Password: ${cred.password}" + } + return null } diff --git a/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/SignUpFragment.kt b/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/SignUpFragment.kt index 9b7d1eb..466ba04 100644 --- a/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/SignUpFragment.kt +++ b/CredentialManager/app/src/main/java/com/google/credentialmanager/sample/SignUpFragment.kt @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright 2023 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -143,10 +143,10 @@ class SignUpFragment : Fragment() { val response = requireContext().readFromAsset("RegFromServer") //Update userId, name and Display name in the mock - return response.replace("$1", binding.username.text.toString()) - .replace("$4", getEncodedChallenge()) - .replace("$3", getEncodedUserId()) - .replace("$2", binding.username.text.toString()) + return response.replace("", getEncodedUserId()) + .replace("", binding.username.text.toString()) + .replace("", binding.username.text.toString()) + .replace("", getEncodedChallenge()) } private fun getEncodedUserId(): String { @@ -177,7 +177,7 @@ class SignUpFragment : Fragment() { try { credentialManager.createCredential(request, requireActivity()) as CreatePasswordResponse } catch (e: Exception) { - Log.e("Auth", " Exception Message : " + e.message) + Log.e("Auth", "createPassword failed with exception: " + e.message) } } @@ -191,7 +191,7 @@ class SignUpFragment : Fragment() { ) as CreatePublicKeyCredentialResponse } catch (e: CreateCredentialException) { configureProgress(View.INVISIBLE) - handleFailure(e) + handlePasskeyFailure(e) } return response } @@ -207,38 +207,30 @@ class SignUpFragment : Fragment() { binding.circularProgressIndicator.visibility = visibility } - //Demonstration purpose : These are type of errors during passkey creation, handle this in your code wisely. - private fun handleFailure(e: CreateCredentialException) { - var msg = "" - when (e) { + // These are types of errors that can occur during passkey creation. + private fun handlePasskeyFailure(e: CreateCredentialException) { + val msg = when (e) { is CreatePublicKeyCredentialDomException -> { // Handle the passkey DOM errors thrown according to the // WebAuthn spec using e.domError - msg = - "An error occurred while creating a passkey, please check logs for additional details" + "An error occurred while creating a passkey, please check logs for additional details." } is CreateCredentialCancellationException -> { // The user intentionally canceled the operation and chose not // to register the credential. - msg = - "The user intentionally canceled the operation and chose not to register the credential. , please check logs for additional details" + "The user intentionally canceled the operation and chose not to register the credential. Check logs for additional details." } is CreateCredentialInterruptedException -> { - msg = - "The operation was interrupted, please retry the call. Check logs for additional details" // Retry-able error. Consider retrying the call. + "The operation was interrupted, please retry the call. Check logs for additional details." } is CreateCredentialProviderConfigurationException -> { // Your app is missing the provider configuration dependency. - // Most likely, you're missing the - // "credentials-play-services-auth" module. - msg = - "Your app is missing the provider configuration dependency. Check logs for additional details" + // Most likely, you're missing "credentials-play-services-auth". + "Your app is missing the provider configuration dependency. Check logs for additional details." } is CreateCredentialUnknownException -> { - msg = - "An unknown error occurred while creating passkey. Check logs for additional details" - Log.w("Auth", e.message.toString()) + "An unknown error occurred while creating passkey. Check logs for additional details." } is CreateCustomCredentialException -> { // You have encountered an error from a 3rd-party SDK. If you @@ -247,12 +239,14 @@ class SignUpFragment : Fragment() { // should check for any custom exception type constants within // that SDK to match with e.type. Otherwise, drop or log the // exception. - msg = - "An unknown error occurred from a 3rd party SDK. Check logs for additional details" + "An unknown error occurred from a 3rd party SDK. Check logs for additional details." + } + else -> { + Log.w("Auth", "Unexpected exception type ${e::class.java.name}") + "An unknown error occurred." } - else -> Log.w("Auth", "Unexpected exception type ${e::class.java.name}") } - Log.e("Auth", " Exception Message : " + e.message.toString()) + Log.e("Auth", "createPasskey failed with exception: " + e.message.toString()) activity?.showErrorAlert(msg) } diff --git a/CredentialManager/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/CredentialManager/app/src/main/res/drawable-v24/ic_launcher_foreground.xml index 2b068d1..558f4cb 100644 --- a/CredentialManager/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ b/CredentialManager/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -1,3 +1,19 @@ + + - \ No newline at end of file + diff --git a/CredentialManager/app/src/main/res/drawable-v24/passkey.xml b/CredentialManager/app/src/main/res/drawable-v24/passkey.xml index 5d01d51..2af1610 100644 --- a/CredentialManager/app/src/main/res/drawable-v24/passkey.xml +++ b/CredentialManager/app/src/main/res/drawable-v24/passkey.xml @@ -1,3 +1,19 @@ + + + + + + - - diff --git a/CredentialManager/app/src/main/res/layout/fragment_home.xml b/CredentialManager/app/src/main/res/layout/fragment_home.xml index 329806b..79ad362 100644 --- a/CredentialManager/app/src/main/res/layout/fragment_home.xml +++ b/CredentialManager/app/src/main/res/layout/fragment_home.xml @@ -1,3 +1,19 @@ + + + + + + + diff --git a/CredentialManager/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/CredentialManager/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 6b78462..b937bed 100644 --- a/CredentialManager/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/CredentialManager/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,4 +1,20 @@ + + diff --git a/CredentialManager/app/src/main/res/values-land/dimens.xml b/CredentialManager/app/src/main/res/values-land/dimens.xml index ec4deb8..79af8e2 100644 --- a/CredentialManager/app/src/main/res/values-land/dimens.xml +++ b/CredentialManager/app/src/main/res/values-land/dimens.xml @@ -1,3 +1,19 @@ + + 48dp diff --git a/CredentialManager/app/src/main/res/values-w1240dp/dimens.xml b/CredentialManager/app/src/main/res/values-w1240dp/dimens.xml index 2ecead2..048b1ae 100644 --- a/CredentialManager/app/src/main/res/values-w1240dp/dimens.xml +++ b/CredentialManager/app/src/main/res/values-w1240dp/dimens.xml @@ -1,3 +1,19 @@ + + 200dp diff --git a/CredentialManager/app/src/main/res/values-w600dp/dimens.xml b/CredentialManager/app/src/main/res/values-w600dp/dimens.xml index ec4deb8..79af8e2 100644 --- a/CredentialManager/app/src/main/res/values-w600dp/dimens.xml +++ b/CredentialManager/app/src/main/res/values-w600dp/dimens.xml @@ -1,3 +1,19 @@ + + 48dp diff --git a/CredentialManager/app/src/main/res/values/colors.xml b/CredentialManager/app/src/main/res/values/colors.xml index f4b5235..891b453 100644 --- a/CredentialManager/app/src/main/res/values/colors.xml +++ b/CredentialManager/app/src/main/res/values/colors.xml @@ -1,4 +1,20 @@ + + #FF000000 #FFFFFFFF diff --git a/CredentialManager/app/src/main/res/values/dimens.xml b/CredentialManager/app/src/main/res/values/dimens.xml index 59a0b0c..805dfef 100644 --- a/CredentialManager/app/src/main/res/values/dimens.xml +++ b/CredentialManager/app/src/main/res/values/dimens.xml @@ -1,3 +1,19 @@ + + 16dp diff --git a/CredentialManager/app/src/main/res/values/strings.xml b/CredentialManager/app/src/main/res/values/strings.xml index 887de2d..f9dbd19 100644 --- a/CredentialManager/app/src/main/res/values/strings.xml +++ b/CredentialManager/app/src/main/res/values/strings.xml @@ -1,3 +1,19 @@ + + CredentialManagerSample Settings @@ -9,4 +25,4 @@ Hello first fragment Hello second fragment. Arg: %1$s - \ No newline at end of file + diff --git a/CredentialManager/app/src/main/res/values/themes.xml b/CredentialManager/app/src/main/res/values/themes.xml index 3181e19..fc1420c 100644 --- a/CredentialManager/app/src/main/res/values/themes.xml +++ b/CredentialManager/app/src/main/res/values/themes.xml @@ -1,3 +1,19 @@ + +