From b3d633cf0e8a6c35be9755702dedbea29ff3d897 Mon Sep 17 00:00:00 2001 From: Vitaly Takmazov Date: Tue, 4 Sep 2018 11:22:57 +0300 Subject: WebFinger support --- .../com/juick/server/api/webfinger/Resource.java | 56 ++++++++++++++++++++++ .../juick/server/api/webfinger/model/Account.java | 24 ++++++++++ .../com/juick/server/api/webfinger/model/Link.java | 31 ++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 juick-server/src/main/java/com/juick/server/api/webfinger/Resource.java create mode 100644 juick-server/src/main/java/com/juick/server/api/webfinger/model/Account.java create mode 100644 juick-server/src/main/java/com/juick/server/api/webfinger/model/Link.java (limited to 'juick-server/src/main/java/com/juick/server/api') diff --git a/juick-server/src/main/java/com/juick/server/api/webfinger/Resource.java b/juick-server/src/main/java/com/juick/server/api/webfinger/Resource.java new file mode 100644 index 00000000..e43e02d1 --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/api/webfinger/Resource.java @@ -0,0 +1,56 @@ +package com.juick.server.api.webfinger; + +import com.juick.User; +import com.juick.server.api.webfinger.model.Account; +import com.juick.server.api.webfinger.model.Link; +import com.juick.server.util.HttpNotFoundException; +import com.juick.service.UserService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.util.UriComponentsBuilder; +import rocks.xmpp.addr.Jid; + +import javax.inject.Inject; +import java.util.Arrays; +import java.util.Collections; + +@RestController +public class Resource { + @Inject + private UserService userService; + @Value("${web_domain:localhost}") + private String domain; + @Value("${ap_base_uri:http://localhost:8080/}") + private String baseUri; + + @GetMapping("/.well-known/webfinger") + public Account getWebResource(@RequestParam String resource) { + if (resource.startsWith("acct:")) { + Jid account = Jid.of(resource.substring(5)); + if (account.getDomain().equals(domain)) { + User user = userService.getUserByName(account.getLocal()); + if (!user.isAnonymous()) { + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(baseUri); + builder.path(String.format("/u/%s", user.getName())); + Link blog = new Link(); + blog.setRel("self"); + blog.setType("application/activity+json"); + blog.setHref(builder.toUriString()); + UriComponentsBuilder rssBuilder = UriComponentsBuilder.fromHttpUrl(baseUri); + rssBuilder.path(String.format("/rss/%s/blog", user.getName())); + Link rss = new Link(); + rss.setRel("self"); + rss.setType("application/rss+xml"); + rss.setHref(rssBuilder.toUriString()); + Account result = new Account(); + result.setSubject(resource); + result.setLinks(Arrays.asList(blog, rss)); + return result; + } + } + } + throw new HttpNotFoundException(); + } +} diff --git a/juick-server/src/main/java/com/juick/server/api/webfinger/model/Account.java b/juick-server/src/main/java/com/juick/server/api/webfinger/model/Account.java new file mode 100644 index 00000000..892fa303 --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/api/webfinger/model/Account.java @@ -0,0 +1,24 @@ +package com.juick.server.api.webfinger.model; + +import java.util.List; + +public class Account { + private String subject; + private List links; + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public List getLinks() { + return links; + } + + public void setLinks(List links) { + this.links = links; + } +} diff --git a/juick-server/src/main/java/com/juick/server/api/webfinger/model/Link.java b/juick-server/src/main/java/com/juick/server/api/webfinger/model/Link.java new file mode 100644 index 00000000..48e7ab67 --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/api/webfinger/model/Link.java @@ -0,0 +1,31 @@ +package com.juick.server.api.webfinger.model; + +public class Link { + private String rel; + private String type; + private String href; + + public String getRel() { + return rel; + } + + public void setRel(String rel) { + this.rel = rel; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getHref() { + return href; + } + + public void setHref(String href) { + this.href = href; + } +} -- cgit v1.2.3