diff options
Diffstat (limited to 'src/main/java/com/juick/service/WebfingerService.java')
-rw-r--r-- | src/main/java/com/juick/service/WebfingerService.java | 82 |
1 files changed, 49 insertions, 33 deletions
diff --git a/src/main/java/com/juick/service/WebfingerService.java b/src/main/java/com/juick/service/WebfingerService.java index dc978763..ca49bd51 100644 --- a/src/main/java/com/juick/service/WebfingerService.java +++ b/src/main/java/com/juick/service/WebfingerService.java @@ -1,57 +1,73 @@ -package com.juick.service; +/* + * Copyright (C) 2008-2023, Juick + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ -import java.net.URI; -import java.util.Collections; - -import javax.inject.Inject; +package com.juick.service; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.juick.www.api.webfinger.Resource; +import com.juick.www.api.webfinger.model.Account; +import com.juick.www.api.webfinger.model.Link; +import okhttp3.OkHttpClient; +import okhttp3.Request; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; +import org.springframework.http.*; import org.springframework.stereotype.Component; import org.springframework.web.client.RestClientException; -import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; - -import com.juick.www.api.webfinger.model.Account; -import com.juick.www.api.webfinger.model.Link; - import rocks.xmpp.addr.Jid; +import javax.inject.Inject; +import java.io.IOException; +import java.net.URI; +import java.util.Collections; + @Component public class WebfingerService { private static final Logger logger = LoggerFactory.getLogger("ActivityPub"); - - private final RestTemplate restClient; + private final OkHttpClient httpClient; + private final ObjectMapper jsonMapper; @Inject - public WebfingerService(final RestTemplate restClient) { - this.restClient = restClient; + public WebfingerService(final OkHttpClient httpClient, final ObjectMapper jsonMapper) { + this.httpClient = httpClient; + this.jsonMapper = jsonMapper; } public URI discoverAccountURI(String acct, MediaType linkType) { Jid acctId = Jid.of(acct); - URI resourceUri = UriComponentsBuilder.fromPath("/.well-known/webfinger").host(acctId.getDomain()) - .scheme("https").queryParam("resource", "acct:" + acct).build().toUri(); - HttpHeaders headers = new HttpHeaders(); - headers.setAccept(Collections.singletonList(MediaType.valueOf("application/jrd+json"))); - HttpEntity<Void> webfingerRequest = new HttpEntity<>(headers); + var resourceUri = UriComponentsBuilder.fromPath("/.well-known/webfinger").host(acctId.getDomain()) + .scheme("https").queryParam("resource", "acct:" + acct).build().toUriString(); + var request = new Request.Builder() + .url(resourceUri) + .addHeader(HttpHeaders.ACCEPT, Resource.MEDIA_TYPE) + .build(); try { - ResponseEntity<Account> response = restClient.exchange(resourceUri, HttpMethod.GET, webfingerRequest, - Account.class); - if (response.getStatusCode().is2xxSuccessful()) { - var account = response.getBody(); - for (Link l : account.links()) { - if (l.rel().equals("self") && l.type().equals(linkType.toString())) { - return URI.create(l.href()); + try(var response = httpClient.newCall(request).execute()) { + if (response.isSuccessful() && response.body() != null) { + var account = jsonMapper.readValue(response.body().string(), Account.class); + for (Link l : account.links()) { + if (l.rel().equals("self") && l.type().equals(linkType.toString())) { + return URI.create(l.href()); + } } } } - } catch (RestClientException e) { - logger.warn("Cannot discover person {}: {}", acct, e.getMessage()); + } catch (IOException e) { + return URI.create(StringUtils.EMPTY); } return URI.create(StringUtils.EMPTY); } |