[tr064] Fix clearing of auth (results) (#15415)

* [tr064] Fix clearing of auth (results)

In case of multiple root things the auth store (results and digests) was cleared for all clients instead of only removing the failed auth result or old authentication.

* fix TAM request

Signed-off-by: Jan N. Klug <github@klug.nrw>
This commit is contained in:
J-N-K 2023-08-13 18:55:13 +02:00 committed by GitHub
parent 7c4e70f993
commit 196d8095bb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 6 deletions

View File

@ -207,8 +207,6 @@ public class Tr064RootHandler extends BaseBridgeHandler implements PhonebookProv
uninstallPolling();
stateCache.clear();
scpdUtil = null;
super.dispose();
}
/**
@ -267,8 +265,16 @@ public class Tr064RootHandler extends BaseBridgeHandler implements PhonebookProv
// clear auth cache and force re-auth
AuthenticationStore authStore = httpClient.getAuthenticationStore();
authStore.clearAuthentications();
authStore.clearAuthenticationResults();
URI endpointUri = URI.create(endpointBaseURL);
Authentication authentication = authStore.findAuthentication("Digest", endpointUri,
Authentication.ANY_REALM);
if (authentication != null) {
authStore.removeAuthentication(authentication);
}
Authentication.Result authResult = authStore.findAuthenticationResult(endpointUri);
if (authResult != null) {
authStore.removeAuthenticationResult(authResult);
}
authStore.addAuthentication(new DigestAuthentication(new URI(endpointBaseURL), Authentication.ANY_REALM,
config.user, config.password));

View File

@ -17,6 +17,7 @@ import static org.openhab.binding.tr064.internal.util.Util.getSOAPElement;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URI;
import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
@ -37,6 +38,7 @@ import javax.xml.soap.SOAPPart;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.client.api.Authentication;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.client.api.Request;
import org.eclipse.jetty.client.util.BytesContentProvider;
@ -177,7 +179,11 @@ public class SOAPConnector {
if (response.getStatus() == HttpStatus.UNAUTHORIZED_401) {
// retry once if authentication expired
logger.trace("Re-Auth needed.");
httpClient.getAuthenticationStore().clearAuthenticationResults();
Authentication.Result authResult = httpClient.getAuthenticationStore()
.findAuthenticationResult(URI.create(endpointBaseURL));
if (authResult != null) {
httpClient.getAuthenticationStore().removeAuthenticationResult(authResult);
}
request = prepareSOAPRequest(soapRequest).timeout(timeout, TimeUnit.SECONDS);
response = request.send();
}

View File

@ -244,7 +244,7 @@ public class SOAPValueConverter {
@SuppressWarnings("unused")
private State processTamListURL(State state, Tr064ChannelConfig channelConfig) throws PostProcessingException {
try {
ContentResponse response = httpClient.newRequest(state.toString()).timeout(timeout, TimeUnit.MILLISECONDS)
ContentResponse response = httpClient.newRequest(state.toString()).timeout(timeout, TimeUnit.SECONDS)
.send();
String responseContent = response.getContentAsString();
int messageCount = responseContent.split("<New>1</New>").length - 1;