diff --git a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/HomeFragment.kt b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/HomeFragment.kt index 742663e..2d9e396 100644 --- a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/HomeFragment.kt +++ b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/HomeFragment.kt @@ -25,6 +25,7 @@ import com.tarkvaraprojekt.mobileauthapp.NFC.Comms import com.tarkvaraprojekt.mobileauthapp.databinding.FragmentHomeBinding import com.tarkvaraprojekt.mobileauthapp.model.ParametersViewModel import com.tarkvaraprojekt.mobileauthapp.model.SmartCardViewModel +import org.json.JSONObject import java.lang.Exception import java.lang.RuntimeException import java.net.URL @@ -91,7 +92,8 @@ class HomeFragment : Fragment() { */ private fun goToTheNextFragment(mobile: Boolean = false) { (activity as MainActivity).menuAvailable = false - val action = HomeFragmentDirections.actionHomeFragmentToCanFragment(auth = true, mobile = mobile) + val action = + HomeFragmentDirections.actionHomeFragmentToCanFragment(auth = true, mobile = mobile) findNavController().navigate(action) } @@ -117,28 +119,39 @@ class HomeFragment : Fragment() { intentParams.setAuthUrl(requireActivity().intent.data!!.getQueryParameter("authUrl")!!) intentParams.setOrigin(requireActivity().intent.data!!.getQueryParameter("originUrl")!!) */ - var getAuthChallengeUrl = requireActivity().intent.data!!.getQueryParameter("getAuthChallengeUrl")!! - getAuthChallengeUrl = getAuthChallengeUrl.substring(1, getAuthChallengeUrl.length - 1) - var postAuthTokenUrl = requireActivity().intent.data!!.getQueryParameter("postAuthTokenUrl")!! + var getAuthChallengeUrl = + requireActivity().intent.data!!.getQueryParameter("getAuthChallengeUrl")!! + getAuthChallengeUrl = + getAuthChallengeUrl.substring(1, getAuthChallengeUrl.length - 1) + var postAuthTokenUrl = + requireActivity().intent.data!!.getQueryParameter("postAuthTokenUrl")!! postAuthTokenUrl = postAuthTokenUrl.substring(1, postAuthTokenUrl.length - 1) - val headers = requireActivity().intent.data!!.getQueryParameter("headers")!! + val headers = + getHeaders(requireActivity().intent.data!!.getQueryParameter("headers")!!) intentParams.setAuthUrl(postAuthTokenUrl) val address = "https://" + URL(getAuthChallengeUrl).host intentParams.setOrigin(address) - Log.w("ORIGIN", intentParams.origin) intentParams.setHeaders(headers) Ion.getDefault(activity).conscryptMiddleware.enable(false) - Ion.with(activity) + val ion = Ion.with(activity) .load(getAuthChallengeUrl) + + // Set headers. + for ((header, value) in intentParams.headers) { + ion.setHeader(header, value) + } + + ion .asJsonObject() .setCallback { _, result -> try { // Get data from the result and call launchAuth method - val challenge = result.asJsonObject["nonce"].toString().replace("\"", "") + val challenge = + result.asJsonObject["nonce"].toString().replace("\"", "") intentParams.setChallenge(challenge) goToTheNextFragment(mobile) } catch (e: Exception) { - Log.i("GETrequest", "was unsuccessful") + Log.i("GETrequest", "was unsuccessful" + e.message) throw RuntimeException() } } @@ -159,7 +172,7 @@ class HomeFragment : Fragment() { } else { message.setMessage(getString(R.string.problem_other)) } - message.setPositiveButton(getString(R.string.continue_button)) {_, _ -> + message.setPositiveButton(getString(R.string.continue_button)) { _, _ -> val resultIntent = Intent() requireActivity().setResult(AppCompatActivity.RESULT_CANCELED, resultIntent) requireActivity().finish() @@ -196,6 +209,17 @@ class HomeFragment : Fragment() { } } + private fun getHeaders(headersString: String): Map { + val headers = HashMap() + val headersStringFormatted = headersString.substring(1, headersString.length - 1) + val headersJsonObject = JSONObject(headersStringFormatted) + + for (name in headersJsonObject.keys()) { + headers[name] = headersJsonObject[name].toString() + } + return headers + } + /** * Displays texts that inform the user whether the CAN and PIN 1 are saved on the device or not. * This might help the user to save some time as checking menu is not necessary unless the user @@ -222,7 +246,7 @@ class HomeFragment : Fragment() { val dialog = MaterialAlertDialogBuilder(requireContext()) .setTitle(title) .setMessage(message) - .setPositiveButton(R.string.return_text){_, _ -> } + .setPositiveButton(R.string.return_text) { _, _ -> } .show() val title = dialog.findViewById(R.id.alertTitle) title?.textSize = 24F @@ -242,11 +266,17 @@ class HomeFragment : Fragment() { binding.detectionActionText.text = getString(R.string.action_detect_unavailable) binding.homeActionButton.text = getString(R.string.add_can_text) binding.homeActionButton.setOnClickListener { - val action = HomeFragmentDirections.actionHomeFragmentToCanFragment(saving = true, fromhome = true) + val action = HomeFragmentDirections.actionHomeFragmentToCanFragment( + saving = true, + fromhome = true + ) findNavController().navigate(action) } binding.homeHelpButton.setOnClickListener { - displayMessage(getString(R.string.can_question), getString(R.string.can_explanation)) + displayMessage( + getString(R.string.can_question), + getString(R.string.can_explanation) + ) } binding.homeActionButton.visibility = View.VISIBLE binding.homeHelpButton.visibility = View.VISIBLE @@ -293,13 +323,15 @@ class HomeFragment : Fragment() { findNavController().navigate(action) } } catch (e: Exception) { - when(e) { + when (e) { is TagLostException -> requireActivity().runOnUiThread { - binding.detectionActionText.text = getString(R.string.id_card_removed_early) + binding.detectionActionText.text = + getString(R.string.id_card_removed_early) reset() } else -> requireActivity().runOnUiThread { - binding.detectionActionText.text = getString(R.string.nfc_reading_error) + binding.detectionActionText.text = + getString(R.string.nfc_reading_error) viewModel.deleteCan(requireContext()) canState() reset() diff --git a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/ResultFragment.kt b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/ResultFragment.kt index 966a058..1df15db 100644 --- a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/ResultFragment.kt +++ b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/ResultFragment.kt @@ -11,9 +11,11 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.navArgs import com.google.gson.JsonObject +import com.google.gson.JsonParser import com.koushikdutta.ion.Ion import com.tarkvaraprojekt.mobileauthapp.databinding.FragmentResultBinding import com.tarkvaraprojekt.mobileauthapp.model.ParametersViewModel +import org.json.JSONObject /** * ResultFragment is used to create a JWT and to send response to the website/application @@ -46,8 +48,13 @@ class ResultFragment : Fragment() { /** * Only used when the MobileAuthApp was launched by an app. Not for website use. */ - private fun createResponse(success: Boolean = true, result: String = "noResult", token: String = "noToken") { - val responseCode = if (success) AppCompatActivity.RESULT_OK else AppCompatActivity.RESULT_CANCELED + private fun createResponse( + success: Boolean = true, + result: String = "noResult", + token: String = "noToken" + ) { + val responseCode = + if (success) AppCompatActivity.RESULT_OK else AppCompatActivity.RESULT_CANCELED val resultIntent = Intent() resultIntent.putExtra("result", result) resultIntent.putExtra("token", token) @@ -60,29 +67,35 @@ class ResultFragment : Fragment() { */ fun postToken() { val json = JsonObject() - json.addProperty("token", paramsModel.token) - json.addProperty("headers", paramsModel.headers) + json.addProperty("auth-token", paramsModel.token) + + Ion.getDefault(activity).conscryptMiddleware.enable(false) - Ion.with(activity) + val ion = Ion.with(activity) .load(paramsModel.authUrl) - .setJsonObjectBody(json) - .asJsonObject() - .setCallback { e, result -> - if (result == null) { - if (args.mobile) { - createResponse(false) - } else { - requireActivity().finishAndRemoveTask() - } + for ((header, value) in paramsModel.headers) { + ion.setHeader(header, value) + } + + ion + .setJsonObjectBody(json) + .asJsonObject() + .setCallback { e, result -> + if (result == null) { + if (args.mobile) { + createResponse(false) } else { - if (args.mobile) { - createResponse(true, result.toString(), paramsModel.token) - } else { - requireActivity().finishAndRemoveTask() - } + requireActivity().finishAndRemoveTask() + } + } else { + if (args.mobile) { + createResponse(true, result.toString(), paramsModel.token) + } else { + requireActivity().finishAndRemoveTask() } } + } } override fun onDestroy() { diff --git a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/model/ParametersViewModel.kt b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/model/ParametersViewModel.kt index 64553f9..a833c30 100644 --- a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/model/ParametersViewModel.kt +++ b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/model/ParametersViewModel.kt @@ -1,5 +1,7 @@ package com.tarkvaraprojekt.mobileauthapp.model +import android.util.Log +import android.util.Log.WARN import androidx.lifecycle.ViewModel class ParametersViewModel: ViewModel() { @@ -16,7 +18,7 @@ class ParametersViewModel: ViewModel() { private var _origin: String = "" val origin get() = _origin - private var _headers: String = "" + private var _headers: Map = HashMap() val headers get() =_headers fun setChallenge(newChallenge: String) { @@ -35,7 +37,8 @@ class ParametersViewModel: ViewModel() { _origin = newOrigin } - fun setHeaders(newHeaders: String) { + fun setHeaders(newHeaders: Map) { + Log.i("HEADERS", newHeaders.toList().toString()) _headers = newHeaders } } \ No newline at end of file diff --git a/MobileAuthApp/app/src/main/res/values-en/strings.xml b/MobileAuthApp/app/src/main/res/values-en/strings.xml index d0770eb..eb32490 100644 --- a/MobileAuthApp/app/src/main/res/values-en/strings.xml +++ b/MobileAuthApp/app/src/main/res/values-en/strings.xml @@ -67,7 +67,7 @@ SEX - Controlling the created token + Checking the created token The app will close automatically