feat: Allow specifying your own Base URL for Addy.io

This commit is contained in:
Artem Chepurnyi 2024-01-13 09:09:16 +02:00
parent e097d26453
commit 82db6151bc
4 changed files with 23 additions and 2 deletions

View File

@ -11,6 +11,7 @@ import com.artemchep.keyguard.feature.localization.TextHolder
data class EmailRelaySchema( data class EmailRelaySchema(
val title: TextHolder, val title: TextHolder,
val hint: TextHolder? = null, val hint: TextHolder? = null,
val description: TextHolder? = null,
val type: ConfirmationRoute.Args.Item.StringItem.Type = ConfirmationRoute.Args.Item.StringItem.Type.Text, val type: ConfirmationRoute.Args.Item.StringItem.Type = ConfirmationRoute.Args.Item.StringItem.Type.Text,
/** /**
* `true` if the empty value is a valid * `true` if the empty value is a valid

View File

@ -7,6 +7,7 @@ import com.artemchep.keyguard.common.service.relays.api.EmailRelay
import com.artemchep.keyguard.common.service.relays.api.EmailRelaySchema import com.artemchep.keyguard.common.service.relays.api.EmailRelaySchema
import com.artemchep.keyguard.feature.confirmation.ConfirmationRoute import com.artemchep.keyguard.feature.confirmation.ConfirmationRoute
import com.artemchep.keyguard.feature.localization.TextHolder import com.artemchep.keyguard.feature.localization.TextHolder
import com.artemchep.keyguard.provider.bitwarden.api.builder.ensureSuffix
import com.artemchep.keyguard.res.Res import com.artemchep.keyguard.res.Res
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.call.body import io.ktor.client.call.body
@ -30,13 +31,16 @@ class AnonAddyEmailRelay(
private val httpClient: HttpClient, private val httpClient: HttpClient,
) : EmailRelay { ) : EmailRelay {
companion object { companion object {
private const val ENDPOINT = "https://app.addy.io/api/v1/aliases" private const val ENDPOINT_BASE_URL = "https://app.addy.io/"
private const val ENDPOINT_PATH = "api/v1/aliases"
private const val KEY_API_KEY = "apiKey" private const val KEY_API_KEY = "apiKey"
private const val HINT_API_KEY = private const val HINT_API_KEY =
"addy_io_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" "addy_io_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
private const val KEY_DOMAIN = "domain" private const val KEY_DOMAIN = "domain"
private const val HINT_DOMAIN = "anonaddy.me" private const val HINT_DOMAIN = "anonaddy.me"
private const val KEY_BASE_URL = "base_url"
private const val HINT_BASE_URL = ENDPOINT_BASE_URL
} }
override val type = "AnonAddy" override val type = "AnonAddy"
@ -57,6 +61,12 @@ class AnonAddyEmailRelay(
hint = TextHolder.Value(HINT_DOMAIN), hint = TextHolder.Value(HINT_DOMAIN),
canBeEmpty = false, canBeEmpty = false,
), ),
KEY_BASE_URL to EmailRelaySchema(
title = TextHolder.Res(Res.strings.emailrelay_base_env_server_url_label),
hint = TextHolder.Value(HINT_BASE_URL),
description = TextHolder.Res(Res.strings.emailrelay_base_env_note),
canBeEmpty = true,
),
) )
constructor(directDI: DirectDI) : this( constructor(directDI: DirectDI) : this(
@ -73,9 +83,16 @@ class AnonAddyEmailRelay(
val domain = requireNotNull(config[KEY_DOMAIN]) { val domain = requireNotNull(config[KEY_DOMAIN]) {
"Domain is required for creating an email alias." "Domain is required for creating an email alias."
} }
val apiUrl = kotlin.run {
val baseUrl = config[KEY_BASE_URL]
?.trim()
?.takeIf { it.isNotEmpty() }
?: ENDPOINT_BASE_URL
baseUrl.ensureSuffix("/") + ENDPOINT_PATH
}
// https://app.anonaddy.com/docs/#aliases-POSTapi-v1-aliases // https://app.anonaddy.com/docs/#aliases-POSTapi-v1-aliases
val response = httpClient val response = httpClient
.post(ENDPOINT) { .post(apiUrl) {
header("Authorization", "Bearer $apiKey") header("Authorization", "Bearer $apiKey")
val body = AnonAddyRequest( val body = AnonAddyRequest(

View File

@ -92,6 +92,7 @@ fun produceEmailRelayListState(
value = itemValue, value = itemValue,
title = translate(emailRelay.value.title), title = translate(emailRelay.value.title),
hint = emailRelay.value.hint?.let { translate(it) }, hint = emailRelay.value.hint?.let { translate(it) },
description = emailRelay.value.description?.let { translate(it) },
type = emailRelay.value.type, type = emailRelay.value.type,
canBeEmpty = emailRelay.value.canBeEmpty, canBeEmpty = emailRelay.value.canBeEmpty,
) )

View File

@ -474,6 +474,8 @@
<string name="emailrelay_delete_many_confirmation_title">Delete the email forwarders?</string> <string name="emailrelay_delete_many_confirmation_title">Delete the email forwarders?</string>
<string name="emailrelay_integration_title">Email forwarder integration</string> <string name="emailrelay_integration_title">Email forwarder integration</string>
<string name="emailrelay_empty_label">No email forwarders</string> <string name="emailrelay_empty_label">No email forwarders</string>
<string name="emailrelay_base_env_server_url_label">Server URL</string>
<string name="emailrelay_base_env_note">Specify the base URL of your self-hosted installation.</string>
<string name="urloverride_header_title">URL override</string> <string name="urloverride_header_title">URL override</string>
<string name="urloverride_list_header_title">URL overrides</string> <string name="urloverride_list_header_title">URL overrides</string>