aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Vitaly Takmazov2019-02-24 19:29:36 +0300
committerGravatar Vitaly Takmazov2019-02-24 19:29:36 +0300
commite9a3361b31ae49a801b03bd2950e38896b1f3863 (patch)
tree71e9acb59e1c7ae166d26e99f125a233e52b46ca /src
parenta7d29047bd49ae8afc887abba0317ba7d4aa49b1 (diff)
/.well-known/nodeinfo
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/juick/server/api/xnodeinfo2/Info.java35
-rw-r--r--src/main/java/com/juick/server/api/xnodeinfo2/model/NodeInfo.java24
-rw-r--r--src/main/java/com/juick/server/api/xnodeinfo2/model/Server.java6
-rw-r--r--src/main/java/com/juick/server/api/xnodeinfo2/model/ServiceInfo.java3
-rw-r--r--src/main/java/com/juick/server/api/xnodeinfo2/model/Usage.java3
-rw-r--r--src/main/java/com/juick/server/api/xnodeinfo2/model/UserStats.java3
-rw-r--r--src/main/java/com/juick/server/configuration/SecurityConfig.java7
-rw-r--r--src/test/java/com/juick/server/tests/ServerTests.java25
8 files changed, 101 insertions, 5 deletions
diff --git a/src/main/java/com/juick/server/api/xnodeinfo2/Info.java b/src/main/java/com/juick/server/api/xnodeinfo2/Info.java
index 36e36bdd..7ecd02cb 100644
--- a/src/main/java/com/juick/server/api/xnodeinfo2/Info.java
+++ b/src/main/java/com/juick/server/api/xnodeinfo2/Info.java
@@ -1,15 +1,22 @@
package com.juick.server.api.xnodeinfo2;
+import com.cliqset.xrd.Link;
+import com.cliqset.xrd.XRD;
+import com.fasterxml.jackson.annotation.JsonView;
import com.juick.server.api.xnodeinfo2.model.*;
import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.MediaType;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.util.UriComponentsBuilder;
import javax.inject.Inject;
+import java.net.URI;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Arrays;
+import java.util.Collections;
@RestController
public class Info {
@@ -18,9 +25,9 @@ public class Info {
@Inject
private JdbcTemplate jdbcTemplate;
- @GetMapping("/.well-known/x-nodeinfo2")
- public NodeInfo showNodeInfo() {
+ private NodeInfo getCurrentNodeInfo(String version) {
NodeInfo nodeInfo = new NodeInfo();
+ nodeInfo.setVersion(version);
Server server = new Server();
server.setBaseUrl(baseUri);
server.setName("Juick");
@@ -47,4 +54,28 @@ public class Info {
nodeInfo.setUsage(usage);
return nodeInfo;
}
+
+ @GetMapping(value = "/.well-known/x-nodeinfo2", consumes = MediaType.APPLICATION_JSON_VALUE)
+ @JsonView(NodeInfo.XNodeInfoView.class)
+ public NodeInfo showXNodeInfo() {
+ return getCurrentNodeInfo("1.0");
+ }
+
+ @GetMapping(value = "/.well-known/nodeinfo", consumes = MediaType.APPLICATION_JSON_VALUE)
+ public XRD getNodeInfoLinks() {
+ Link nodeinfo = new Link();
+ nodeinfo.setRel(URI.create("http://nodeinfo.diaspora.software/ns/schema/2.0"));
+ UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromUriString(baseUri);
+ uriComponentsBuilder.replacePath("/api/nodeinfo/2.0");
+ nodeinfo.setHref(uriComponentsBuilder.build().toUri());
+ XRD xrd = new XRD();
+ xrd.setLinks(Collections.singletonList(nodeinfo));
+ return xrd;
+ }
+
+ @GetMapping(value = "/api/nodeinfo/2.0", consumes = MediaType.APPLICATION_JSON_VALUE)
+ @JsonView(NodeInfo.NodeInfoView.class)
+ public NodeInfo showNodeInfo() {
+ return getCurrentNodeInfo("2.0");
+ }
}
diff --git a/src/main/java/com/juick/server/api/xnodeinfo2/model/NodeInfo.java b/src/main/java/com/juick/server/api/xnodeinfo2/model/NodeInfo.java
index 06fe354f..44bd4325 100644
--- a/src/main/java/com/juick/server/api/xnodeinfo2/model/NodeInfo.java
+++ b/src/main/java/com/juick/server/api/xnodeinfo2/model/NodeInfo.java
@@ -1,27 +1,43 @@
package com.juick.server.api.xnodeinfo2.model;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonView;
+
import java.util.List;
public class NodeInfo {
+ private String version;
+
private Server server;
private List<String> protocols;
private ServiceInfo services;
+ @JsonView({XNodeInfoView.class, NodeInfoView.class})
public String getVersion() {
- return "1.0";
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
}
+ @JsonView(XNodeInfoView.class)
public Server getServer() {
return server;
}
+ @JsonView(NodeInfoView.class)
+ public Server getSoftware() {
+ return server;
+ }
public void setServer(Server server) {
this.server = server;
}
+ @JsonView({XNodeInfoView.class, NodeInfoView.class})
public List<String> getProtocols() {
return protocols;
}
@@ -30,6 +46,7 @@ public class NodeInfo {
this.protocols = protocols;
}
+ @JsonView({XNodeInfoView.class, NodeInfoView.class})
public ServiceInfo getServices() {
return services;
}
@@ -38,12 +55,14 @@ public class NodeInfo {
this.services = services;
}
+ @JsonView({XNodeInfoView.class, NodeInfoView.class})
public boolean getOpenRegistrations() {
return true;
}
private Usage usage;
+ @JsonView({XNodeInfoView.class, NodeInfoView.class})
public Usage getUsage() {
return usage;
}
@@ -51,4 +70,7 @@ public class NodeInfo {
public void setUsage(Usage usage) {
this.usage = usage;
}
+
+ public interface NodeInfoView {}
+ public interface XNodeInfoView {}
}
diff --git a/src/main/java/com/juick/server/api/xnodeinfo2/model/Server.java b/src/main/java/com/juick/server/api/xnodeinfo2/model/Server.java
index a772d268..08c1a696 100644
--- a/src/main/java/com/juick/server/api/xnodeinfo2/model/Server.java
+++ b/src/main/java/com/juick/server/api/xnodeinfo2/model/Server.java
@@ -1,11 +1,14 @@
package com.juick.server.api.xnodeinfo2.model;
+import com.fasterxml.jackson.annotation.JsonView;
+
public class Server {
private String baseUrl;
private String name;
private String software;
private String version;
+ @JsonView(NodeInfo.XNodeInfoView.class)
public String getBaseUrl() {
return baseUrl;
}
@@ -14,6 +17,7 @@ public class Server {
this.baseUrl = baseUrl;
}
+ @JsonView({NodeInfo.NodeInfoView.class, NodeInfo.XNodeInfoView.class})
public String getName() {
return name;
}
@@ -22,6 +26,7 @@ public class Server {
this.name = name;
}
+ @JsonView(NodeInfo.XNodeInfoView.class)
public String getSoftware() {
return software;
}
@@ -30,6 +35,7 @@ public class Server {
this.software = software;
}
+ @JsonView({NodeInfo.NodeInfoView.class, NodeInfo.XNodeInfoView.class})
public String getVersion() {
return version;
}
diff --git a/src/main/java/com/juick/server/api/xnodeinfo2/model/ServiceInfo.java b/src/main/java/com/juick/server/api/xnodeinfo2/model/ServiceInfo.java
index 5b6d2baa..0114488f 100644
--- a/src/main/java/com/juick/server/api/xnodeinfo2/model/ServiceInfo.java
+++ b/src/main/java/com/juick/server/api/xnodeinfo2/model/ServiceInfo.java
@@ -1,7 +1,10 @@
package com.juick.server.api.xnodeinfo2.model;
+import com.fasterxml.jackson.annotation.JsonView;
+
import java.util.List;
+@JsonView({NodeInfo.NodeInfoView.class, NodeInfo.XNodeInfoView.class})
public class ServiceInfo {
private List<String> inbound;
private List<String> outbound;
diff --git a/src/main/java/com/juick/server/api/xnodeinfo2/model/Usage.java b/src/main/java/com/juick/server/api/xnodeinfo2/model/Usage.java
index e04ea48b..f270296f 100644
--- a/src/main/java/com/juick/server/api/xnodeinfo2/model/Usage.java
+++ b/src/main/java/com/juick/server/api/xnodeinfo2/model/Usage.java
@@ -1,5 +1,8 @@
package com.juick.server.api.xnodeinfo2.model;
+import com.fasterxml.jackson.annotation.JsonView;
+
+@JsonView({NodeInfo.NodeInfoView.class, NodeInfo.XNodeInfoView.class})
public class Usage {
private UserStats users;
private int localPosts;
diff --git a/src/main/java/com/juick/server/api/xnodeinfo2/model/UserStats.java b/src/main/java/com/juick/server/api/xnodeinfo2/model/UserStats.java
index 515661e3..cca31be6 100644
--- a/src/main/java/com/juick/server/api/xnodeinfo2/model/UserStats.java
+++ b/src/main/java/com/juick/server/api/xnodeinfo2/model/UserStats.java
@@ -1,5 +1,8 @@
package com.juick.server.api.xnodeinfo2.model;
+import com.fasterxml.jackson.annotation.JsonView;
+
+@JsonView({NodeInfo.NodeInfoView.class, NodeInfo.XNodeInfoView.class})
public class UserStats {
private int total;
private int activeHalfyear;
diff --git a/src/main/java/com/juick/server/configuration/SecurityConfig.java b/src/main/java/com/juick/server/configuration/SecurityConfig.java
index c5cb4a55..df0da16e 100644
--- a/src/main/java/com/juick/server/configuration/SecurityConfig.java
+++ b/src/main/java/com/juick/server/configuration/SecurityConfig.java
@@ -116,8 +116,11 @@ public class SecurityConfig {
.addFilterBefore(new HTTPSignatureAuthenticationFilter(signatureManager, userService), BasicAuthenticationFilter.class)
.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS).permitAll()
- .antMatchers("/api/", "/api/messages", "/api/avatar", "/api/messages/discussions", "/api/users", "/api/thread", "/api/tags", "/api/tlgmbtwbhk", "/api/fbwbhk",
- "/api/skypebotendpoint", "/api/_fblogin", "/api/_vklogin", "/api/_tglogin", "/api/_google", "/api/signup", "/api/inbox", "/api/events", "/api/info/**").permitAll()
+ .antMatchers("/api/", "/api/messages", "/api/avatar", "/api/messages/discussions",
+ "/api/users", "/api/thread", "/api/tags", "/api/tlgmbtwbhk", "/api/fbwbhk",
+ "/api/skypebotendpoint", "/api/_fblogin", "/api/_vklogin", "/api/_tglogin",
+ "/api/_google", "/api/signup", "/api/inbox", "/api/events", "/api/info/**",
+ "/api/nodeinfo/2.0").permitAll()
.anyRequest().hasRole("USER")
.and()
.anonymous().principal(JuickUser.ANONYMOUS_USER).authorities(JuickUser.ANONYMOUS_AUTHORITY)
diff --git a/src/test/java/com/juick/server/tests/ServerTests.java b/src/test/java/com/juick/server/tests/ServerTests.java
index a509b36d..5c421f07 100644
--- a/src/test/java/com/juick/server/tests/ServerTests.java
+++ b/src/test/java/com/juick/server/tests/ServerTests.java
@@ -19,6 +19,7 @@ package com.juick.server.tests;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gargoylesoftware.htmlunit.CookieManager;
import com.gargoylesoftware.htmlunit.WebClient;
@@ -1961,4 +1962,28 @@ public class ServerTests {
Follow follow = jsonMapper.readValue(followData, Follow.class);
assertThat(follow.getActor(), is("https://ussr.win/channel/zlax"));
}
+ @Test
+ public void nodeinfo() throws Exception {
+ MvcResult nodeinfoXRD = mockMvc.perform(get("/.well-known/nodeinfo")
+ .contentType(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andReturn();
+ JsonNode node = jsonMapper.readTree(nodeinfoXRD.getResponse().getContentAsString());
+ assertThat(node.get("links"), notNullValue());
+ String nodeinfoUrl = node.get("links").get(0).get("href").textValue();
+ MvcResult nodeinfoData = mockMvc.perform(get(nodeinfoUrl)
+ .contentType(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andReturn();
+ JsonNode nodeinfo = jsonMapper.readTree(nodeinfoData.getResponse().getContentAsString());
+ assertThat(nodeinfo.get("software"), notNullValue());
+ assertThat(nodeinfo.get("server"), nullValue());
+ MvcResult xnodeinfoData = mockMvc.perform(get("/.well-known/x-nodeinfo2")
+ .contentType(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andReturn();
+ JsonNode xnodeinfo = jsonMapper.readTree(xnodeinfoData.getResponse().getContentAsString());
+ assertThat(xnodeinfo.get("server"), notNullValue());
+ assertThat(xnodeinfo.get("software"), nullValue());
+ }
}