diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-05-19 19:56:01 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-05-28 18:40:38 +0000 |
| commit | 48c8cc5d9515cdbe12d0aaf856d8a8639acb47f6 (patch) | |
| tree | 5bd3299172682d0980748d2b502bf635877c9b4a /android | |
| parent | de06f0b8a83adcab742a4344c310a3aca5448a16 (diff) | |
| download | mullvadvpn-48c8cc5d9515cdbe12d0aaf856d8a8639acb47f6.tar.xz mullvadvpn-48c8cc5d9515cdbe12d0aaf856d8a8639acb47f6.zip | |
Update `AccountCache` to look for an expiry update
Diffstat (limited to 'android')
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt | 44 |
1 files changed, 39 insertions, 5 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt index 4231ff1e40..f63ca84f58 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt @@ -8,6 +8,13 @@ import net.mullvad.talpid.util.EventNotifier import org.joda.time.DateTime import org.joda.time.format.DateTimeFormat +// Number of retry attempts to check for a changed expiry before giving up. +// Current value will force the cache to keep fetching for about four minutes or until a new expiry +// value is received. +// This is only used if the expiry was invalidated and fetching a new expiry returns the same value +// as before the invalidation. +const val MAX_INVALIDATED_RETRIES = 7 + class AccountCache(val daemon: MullvadDaemon, val settingsListener: SettingsListener) { companion object { public val EXPIRY_FORMAT = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss z") @@ -27,6 +34,8 @@ class AccountCache(val daemon: MullvadDaemon, val settingsListener: SettingsList onAccountExpiryChange.notify(value) } + private var oldAccountExpiry: DateTime? = null + val onAccountNumberChange = EventNotifier<String?>(null) val onAccountExpiryChange = EventNotifier<DateTime?>(null) @@ -46,8 +55,9 @@ class AccountCache(val daemon: MullvadDaemon, val settingsListener: SettingsList val result = daemon.getAccountData(account) if (result is GetAccountDataResult.Ok) { - handleNewExpiry(account, result.accountData.expiry) - break + if (handleNewExpiry(account, result.accountData.expiry, retryAttempt)) { + break + } } else if (result is GetAccountDataResult.InvalidAccount) { break } @@ -60,6 +70,15 @@ class AccountCache(val daemon: MullvadDaemon, val settingsListener: SettingsList } } + fun invalidateAccountExpiry(accountExpiryToInvalidate: DateTime) { + synchronized(this) { + if (accountExpiry == accountExpiryToInvalidate) { + oldAccountExpiry = accountExpiryToInvalidate + fetchAccountExpiry() + } + } + } + fun onDestroy() { settingsListener.accountNumberNotifier.unsubscribe(this) jobTracker.cancelAllJobs() @@ -74,11 +93,26 @@ class AccountCache(val daemon: MullvadDaemon, val settingsListener: SettingsList } } - private fun handleNewExpiry(accountNumberUsedForFetch: String, expiryString: String) { + private fun handleNewExpiry( + accountNumberUsedForFetch: String, + expiryString: String, + retryAttempt: Int + ): Boolean { synchronized(this) { - if (accountNumber === accountNumberUsedForFetch) { - accountExpiry = DateTime.parse(expiryString, EXPIRY_FORMAT) + if (accountNumber !== accountNumberUsedForFetch) { + return true + } + + val newAccountExpiry = DateTime.parse(expiryString, EXPIRY_FORMAT) + + if (newAccountExpiry != oldAccountExpiry || retryAttempt >= MAX_INVALIDATED_RETRIES) { + accountExpiry = newAccountExpiry + oldAccountExpiry = null + + return true } + + return false } } |
