aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/juick/service/WebfingerService.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/juick/service/WebfingerService.java')
-rw-r--r--src/main/java/com/juick/service/WebfingerService.java82
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);
}