@@ -10,6 +10,7 @@ import com.android.volley.*
10
10
import com.android.volley.toolbox.JsonObjectRequest
11
11
import com.android.volley.toolbox.StringRequest
12
12
import com.android.volley.toolbox.Volley
13
+ import com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException
13
14
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
14
15
import kotlinx.coroutines.*
15
16
import org.json.JSONArray
@@ -157,7 +158,6 @@ class NetworkUtilities (
157
158
}
158
159
159
160
fun completeQueueTasks (signedToken : String ): Boolean {
160
-
161
161
var deleteQueueFile = File (applicationContext.cacheDir, deleteQueueFilename!! )
162
162
val deleteQueueStream = FileOutputStream (deleteQueueFile, true )
163
163
val deleteQueue: MutableList <String > = mutableListOf ()
@@ -299,6 +299,8 @@ class NetworkUtilities (
299
299
}
300
300
}
301
301
302
+ class IncorrectCredentialsException : Exception ()
303
+
302
304
/* *
303
305
* Make a synchronous GET request with an authorization header using Volley and Kotlin coroutines. The response from this function can be used on a UI thread.
304
306
*
@@ -321,13 +323,19 @@ class NetworkUtilities (
321
323
}
322
324
}, { error ->
323
325
error.printStackTrace()
324
- continuation.cancel (NetworkError ())
326
+ try {
327
+ when (error.networkResponse.statusCode) {
328
+ 500 -> continuation.cancel (IncorrectCredentialsException ())
329
+ else -> continuation.cancel (NetworkError ())
330
+ }
331
+ } catch (_: NullPointerException ) {
332
+ continuation.cancel (NetworkError ())
333
+ }
325
334
Log .e(" Keyspace" , " Keyspace: Couldn't access this resource. Is it online and is your device connected to the internet?" )
326
335
}) {
327
336
@Throws(AuthFailureError ::class )
328
337
override fun getHeaders (): Map <String , String > {
329
338
val params: MutableMap <String , String > = HashMap ()
330
-
331
339
// Headers are case insensitive
332
340
params[" public-key" ] = keyring.ED25519_PUBLIC_KEY !! .toHexString()
333
341
params[" signed-token" ] = signedToken
@@ -434,102 +442,76 @@ class NetworkUtilities (
434
442
val RESPONSE_VAULT_DOES_NOT_EXIST = " RESPONSE_VAULT_DOES_NOT_EXIST"
435
443
val RESPONSE_SUCCESS = " success"
436
444
437
- suspend fun grabLatestVaultFromBackend (signedToken : String , email : String ): Pair < IOUtilities .Vault ?, String > {
445
+ suspend fun grabLatestVaultFromBackend (signedToken : String ): IOUtilities .Vault {
438
446
439
447
val io = IOUtilities (applicationContext, appCompatActivity, keyring)
440
448
val freshVault = io.getVault()
441
449
442
450
var response: String? = null
443
451
var vault: IOUtilities .Vault ? = null
444
- lateinit var statusCode: String
445
- try {
446
-
447
- val vaultData = synchronousGetRequestWithAuthorizationHeader (
448
- vault_items_endpoint,
449
- signedToken = signedToken
450
- )
451
-
452
- val TYPE_LOGIN = " login"
453
- val TYPE_NOTE = " note"
454
- val TYPE_CARD = " card"
455
- val TYPE_TAG = " tag"
456
-
457
- var vaultItemList = mutableListOf<String >()
458
- if (vaultData.toString().contains(" corrupt" )) throw InvalidObjectException (RESPONSE_VAULT_CORRUPT )
459
-
460
- val data = JSONObject (vaultData?.get(" data" ).toString())
461
-
462
- var loginsJSONArray = JSONArray ()
463
- var notesJSONArray = JSONArray ()
464
- var cardsJSONArray = JSONArray ()
465
- var tagsJSONArray = JSONArray ()
466
-
467
- try { loginsJSONArray = data.getJSONArray(TYPE_LOGIN ) } catch (_: JSONException ) {}
468
- try { notesJSONArray = data.getJSONArray(TYPE_NOTE ) } catch (_: JSONException ) {}
469
- try { cardsJSONArray = data.getJSONArray(TYPE_CARD ) } catch (_: JSONException ) {}
470
- try { tagsJSONArray = data.getJSONArray(TYPE_TAG ) } catch (_: JSONException ) {}
471
-
472
- val logins: MutableList <IOUtilities .Login > = mutableListOf ()
473
- val notes: MutableList <IOUtilities .Note > = mutableListOf ()
474
- val cards: MutableList <IOUtilities .Card > = mutableListOf ()
475
- val tags: MutableList <IOUtilities .Tag > = mutableListOf ()
476
-
477
- for (index in 0 until loginsJSONArray.length()) {
478
- val loginAsJSONObject = JSONObject (loginsJSONArray[index].toString())[" data" ].toString()
479
- val login = mapper.readValue (loginAsJSONObject, IOUtilities .Login ::class .java)
480
- logins.add(login)
481
- }
482
452
483
- for (index in 0 until notesJSONArray.length()) {
484
- val noteAsJSONObject = JSONObject (notesJSONArray[index].toString())[" data" ].toString()
485
- val note = mapper.readValue (noteAsJSONObject, IOUtilities .Note ::class .java)
486
- notes.add(note)
487
- }
488
-
489
- for (index in 0 until cardsJSONArray.length()) {
490
- val cardAsJSONObject = JSONObject (cardsJSONArray[index].toString())[" data" ].toString()
491
- val card = mapper.readValue (cardAsJSONObject, IOUtilities .Card ::class .java)
492
- cards.add(card)
493
- }
494
-
495
- for (index in 0 until tagsJSONArray.length()) {
496
- val tagAsJSONObject = JSONObject (tagsJSONArray[index].toString())[" data" ].toString()
497
- val tag = mapper.readValue (tagAsJSONObject, IOUtilities .Tag ::class .java)
498
- tags.add(tag)
499
- }
500
-
501
- vault = IOUtilities .Vault (
502
- version = keyspaceStatus().apiVersion,
503
- tag = tags,
504
- login = logins,
505
- note = notes,
506
- card = cards,
507
- )
508
-
509
- statusCode = RESPONSE_SUCCESS
453
+ val vaultData = synchronousGetRequestWithAuthorizationHeader (
454
+ vault_items_endpoint,
455
+ signedToken = signedToken
456
+ )
510
457
511
- } catch (emptyVault: JSONException ) {
512
- // Log.d("KeyspaceVAULTSYNC", "Server returned empty vault! Received vaultData: ${response.toString()}")
513
- // Log.e("KeyspaceVAULTSYNC", emptyVault.stackTraceToString())
514
- statusCode = RESPONSE_VAULT_DOES_NOT_EXIST
515
- vault = freshVault
516
- return Pair (vault, statusCode)
458
+ val TYPE_LOGIN = " login"
459
+ val TYPE_NOTE = " note"
460
+ val TYPE_CARD = " card"
461
+ val TYPE_TAG = " tag"
462
+
463
+ var vaultItemList = mutableListOf<String >()
464
+ if (vaultData.toString().contains(" corrupt" )) throw InvalidObjectException (RESPONSE_VAULT_CORRUPT )
465
+ val data = JSONObject (vaultData?.get(" data" ).toString())
466
+
467
+ var loginsJSONArray = JSONArray ()
468
+ var notesJSONArray = JSONArray ()
469
+ var cardsJSONArray = JSONArray ()
470
+ var tagsJSONArray = JSONArray ()
471
+
472
+ try { loginsJSONArray = data.getJSONArray(TYPE_LOGIN ) } catch (_: JSONException ) {}
473
+ try { notesJSONArray = data.getJSONArray(TYPE_NOTE ) } catch (_: JSONException ) {}
474
+ try { cardsJSONArray = data.getJSONArray(TYPE_CARD ) } catch (_: JSONException ) {}
475
+ try { tagsJSONArray = data.getJSONArray(TYPE_TAG ) } catch (_: JSONException ) {}
476
+
477
+ val logins: MutableList <IOUtilities .Login > = mutableListOf ()
478
+ val notes: MutableList <IOUtilities .Note > = mutableListOf ()
479
+ val cards: MutableList <IOUtilities .Card > = mutableListOf ()
480
+ val tags: MutableList <IOUtilities .Tag > = mutableListOf ()
481
+
482
+ for (index in 0 until loginsJSONArray.length()) {
483
+ val loginAsJSONObject = JSONObject (loginsJSONArray[index].toString())[" data" ].toString()
484
+ val login = mapper.readValue (loginAsJSONObject, IOUtilities .Login ::class .java)
485
+ logins.add(login)
486
+ }
517
487
518
- } catch (corruptVault: InvalidObjectException ) {
519
- // Log.d("KeyspaceVAULTSYNC", "Server returned corrupt vault! Received vaultData: ${response.toString()}")
520
- // Log.e("KeyspaceVAULTSYNC", corruptVault.stackTraceToString())
521
- statusCode = RESPONSE_VAULT_CORRUPT
522
- vault = freshVault
523
- return Pair (vault, statusCode)
488
+ for (index in 0 until notesJSONArray.length()) {
489
+ val noteAsJSONObject = JSONObject (notesJSONArray[index].toString())[" data" ].toString()
490
+ val note = mapper.readValue (noteAsJSONObject, IOUtilities .Note ::class .java)
491
+ notes.add(note)
492
+ }
524
493
525
- } catch (noInternet: NetworkError ) {
526
- vault = null
527
- statusCode = NETWORK_ERROR
528
- return Pair (vault, statusCode)
494
+ for (index in 0 until cardsJSONArray.length()) {
495
+ val cardAsJSONObject = JSONObject (cardsJSONArray[index].toString())[" data" ].toString()
496
+ val card = mapper.readValue (cardAsJSONObject, IOUtilities .Card ::class .java)
497
+ cards.add(card)
498
+ }
529
499
500
+ for (index in 0 until tagsJSONArray.length()) {
501
+ val tagAsJSONObject = JSONObject (tagsJSONArray[index].toString())[" data" ].toString()
502
+ val tag = mapper.readValue (tagAsJSONObject, IOUtilities .Tag ::class .java)
503
+ tags.add(tag)
530
504
}
531
505
532
- return Pair (vault, statusCode)
506
+ vault = IOUtilities .Vault (
507
+ version = keyspaceStatus().apiVersion,
508
+ tag = tags,
509
+ login = logins,
510
+ note = notes,
511
+ card = cards,
512
+ )
513
+
514
+ return vault
533
515
534
516
}
535
517
@@ -629,6 +611,7 @@ class NetworkUtilities (
629
611
val email : String ,
630
612
)
631
613
614
+ class AccountExistsException : Exception ()
632
615
suspend fun sendSignupRequest (signupParameters : SignupParameters ): SignupResponse ? {
633
616
var signupResponse: SignupResponse ? = null
634
617
@@ -642,10 +625,14 @@ class NetworkUtilities (
642
625
Map ::class .java
643
626
) as Map <String , String >
644
627
645
- signupResponse = mapper.readValue (
646
- synchronousJsonPostRequest(signup_endpoint, signupParametersAsMap)!! .toString(),
647
- SignupResponse ::class .java
648
- )
628
+ try {
629
+ signupResponse = mapper.readValue (
630
+ synchronousJsonPostRequest(signup_endpoint, signupParametersAsMap)!! .toString(),
631
+ SignupResponse ::class .java
632
+ )
633
+ } catch (_: MissingKotlinParameterException ) {
634
+ throw AccountExistsException ()
635
+ }
649
636
650
637
return signupResponse
651
638
}
0 commit comments