From 0e71a726c15dcb7943675db4b12a369dff3f384f Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 20 Oct 2025 11:29:48 +0200 Subject: [PATCH] Fixed infinite LDAP queries loop in case it returns a result that doesn't match the request --- .../org/linphone/contacts/ContactsManager.kt | 70 ++++++++++--------- 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/org/linphone/contacts/ContactsManager.kt b/app/src/main/java/org/linphone/contacts/ContactsManager.kt index d9a478734..33625bfc5 100644 --- a/app/src/main/java/org/linphone/contacts/ContactsManager.kt +++ b/app/src/main/java/org/linphone/contacts/ContactsManager.kt @@ -97,57 +97,63 @@ class ContactsManager override fun onSearchResultsReceived(magicSearch: MagicSearch) { reloadRemoteContactsJob?.cancel() + var queriedSipUri = "" + for ((key, value) in magicSearchMap.entries) { + if (value == magicSearch) { + queriedSipUri = key + } + } + val results = magicSearch.lastSearch - Log.i("$TAG [${results.size}] magic search results available") + Log.i( + "$TAG [${results.size}] magic search results available for query upon SIP URI [$queriedSipUri]" + ) var found = false if (results.isNotEmpty()) { - val result = results.first { - it.friend != null - } + val result = results.first { it.friend != null } if (result != null) { val friend = result.friend!! Log.i("$TAG Found matching friend in source [${result.sourceFlags}]") - found = true + val address = result.address?.asStringUriOnly().orEmpty() + if (address.isEmpty() || (queriedSipUri.isNotEmpty() && queriedSipUri != address)) { + Log.w("$TAG Received friend [${friend.name}] with SIP URI [$address] doesn't match queried SIP URI [$queriedSipUri]") + } else { + found = true - // Store friend in app's cache to be re-used in call history, conversations, etc... - val temporaryFriendList = getRemoteContactDirectoriesCacheFriendList() - temporaryFriendList.addFriend(friend) - newContactAdded(friend) - Log.i( - "$TAG Stored discovered friend [${friend.name}] in temporary friend list, for later use" - ) + // Store friend in app's cache to be re-used in call history, conversations, etc... + val temporaryFriendList = getRemoteContactDirectoriesCacheFriendList() + temporaryFriendList.addFriend(friend) + newContactAdded(friend) + Log.i( + "$TAG Stored discovered friend [${friend.name}] in temporary friend list, for later use" + ) - for (listener in listeners) { - listener.onContactFoundInRemoteDirectory(friend) - } + for (listener in listeners) { + listener.onContactFoundInRemoteDirectory(friend) + } - reloadRemoteContactsJob = coroutineScope.launch { - delay(DELAY_BEFORE_RELOADING_CONTACTS_AFTER_MAGIC_SEARCH_RESULT) - coreContext.postOnCoreThread { - Log.i("$TAG At least a new SIP address was discovered, reloading contacts") - conferenceAvatarMap.values.forEach(ContactAvatarModel::destroy) - conferenceAvatarMap.clear() + reloadRemoteContactsJob = coroutineScope.launch { + delay(DELAY_BEFORE_RELOADING_CONTACTS_AFTER_MAGIC_SEARCH_RESULT) + coreContext.postOnCoreThread { + Log.i("$TAG At least a new SIP address was discovered, reloading contacts") + conferenceAvatarMap.values.forEach(ContactAvatarModel::destroy) + conferenceAvatarMap.clear() - notifyContactsListChanged() + notifyContactsListChanged() + } } } } } - var foundKey = "" - for ((key, value) in magicSearchMap.entries) { - if (value == magicSearch) { - foundKey = key - } - } - if (foundKey.isNotEmpty()) { - magicSearchMap.remove(foundKey) + if (queriedSipUri.isNotEmpty()) { + magicSearchMap.remove(queriedSipUri) if (!found) { Log.i( - "$TAG SIP URI [$foundKey] wasn't found in remote directories, adding it to unknown list to prevent further queries" + "$TAG SIP URI [$queriedSipUri] wasn't found in remote directories, adding it to unknown list to prevent further queries" ) - unknownRemoteContactDirectoriesContactsMap.add(foundKey) + unknownRemoteContactDirectoriesContactsMap.add(queriedSipUri) } } magicSearch.removeListener(this)