diff --git a/app/src/main/java/io/heckel/ntfy/ui/CustomHeaderFragment.kt b/app/src/main/java/io/heckel/ntfy/ui/CustomHeaderFragment.kt
index e18edfcd..78ca57d4 100644
--- a/app/src/main/java/io/heckel/ntfy/ui/CustomHeaderFragment.kt
+++ b/app/src/main/java/io/heckel/ntfy/ui/CustomHeaderFragment.kt
@@ -167,6 +167,8 @@ class CustomHeaderFragment : DialogFragment() {
// Validate header name and check if a user already exists for this server
CoroutineScope(Dispatchers.Main).launch {
var isValid = true
+ val targetBaseUrl = if (header != null) header!!.baseUrl else baseUrl
+
if (headerName.isNotEmpty()) {
if (!validateHeaderName(headerName)) {
headerNameLayout.error = getString(R.string.custom_headers_dialog_error_invalid_name)
@@ -174,20 +176,12 @@ class CustomHeaderFragment : DialogFragment() {
} else if (isReservedHeader(headerName)) {
headerNameLayout.error = getString(R.string.custom_headers_dialog_error_reserved_name)
isValid = false
- } else if (headerName.equals("Authorization", ignoreCase = true)) {
- // Check if a user exists for this server (async)
- val targetBaseUrl = if (header != null) header!!.baseUrl else baseUrl
- val userExists = if (this@CustomHeaderFragment::repository.isInitialized && validUrl(targetBaseUrl)) {
- withContext(Dispatchers.IO) {
- repository.getUser(targetBaseUrl) != null
- }
- } else {
- false
- }
- if (userExists) {
- headerNameLayout.error = getString(R.string.custom_headers_dialog_error_user_exists)
- isValid = false
- }
+ } else if (isDuplicateHeader(targetBaseUrl, headerName)) {
+ headerNameLayout.error = getString(R.string.custom_headers_dialog_error_duplicate)
+ isValid = false
+ } else if (headerName.equals("Authorization", ignoreCase = true) && hasUserForServer(targetBaseUrl)) {
+ headerNameLayout.error = getString(R.string.custom_headers_dialog_error_user_exists)
+ isValid = false
}
}
if (header == null) {
@@ -228,6 +222,31 @@ class CustomHeaderFragment : DialogFragment() {
return reservedHeaders.contains(nameLower) || nameLower.startsWith("sec-websocket-")
}
+ private suspend fun isDuplicateHeader(baseUrl: String, headerName: String): Boolean {
+ if (!this::repository.isInitialized || !validUrl(baseUrl)) {
+ return false
+ }
+ val existingHeaders = withContext(Dispatchers.IO) {
+ repository.getCustomHeadersForServer(baseUrl)
+ }
+ return existingHeaders.any { existingHeader ->
+ // When editing, exclude the current header being edited
+ val isCurrentHeader = header != null &&
+ existingHeader.baseUrl == header!!.baseUrl &&
+ existingHeader.name == header!!.name
+ !isCurrentHeader && existingHeader.name.equals(headerName, ignoreCase = true)
+ }
+ }
+
+ private suspend fun hasUserForServer(baseUrl: String): Boolean {
+ if (!this::repository.isInitialized || !validUrl(baseUrl)) {
+ return false
+ }
+ return withContext(Dispatchers.IO) {
+ repository.getUser(baseUrl) != null
+ }
+ }
+
companion object {
const val TAG = "NtfyCustomHeaderFragment"
private const val BUNDLE_BASE_URL = "baseUrl"
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 4f0e4cea..ba4212d2 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -360,6 +360,7 @@
Ungültige Zeichen im Header-Namen
Dieser Header ist reserviert und wird von ntfy gesetzt
Authorization-Header kann nicht hinzugefügt werden, wenn ein Benutzer für diesen Server konfiguriert ist
+ Ein Header mit diesem Namen existiert bereits für diesen Server
Header-Name (z.B. CF-Access-Client-Id)
Wert (z.B. 9f3c2e4a1b2d4e)
Einen benutzerdefinierten HTTP-Header hinzufügen, der mit jeder Anfrage an den angegebenen Server gesendet wird.
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e7f4b874..0531fe03 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -467,8 +467,8 @@
Save
- Add Custom Header
- Edit Custom Header
+ Add custom header
+ Edit custom header
Service URL
Header name (e.g. CF-Access-Client-Id)
Value (e.g. 9f3c2e4a1b2d4e)
@@ -477,6 +477,7 @@
Header name contains invalid characters
This header is reserved and set by ntfy
Cannot add Authorization header if a user is configured for this server
+ A header with this name already exists for this server
Add
Save
Delete