diff --git a/authentication-module/src/main/java/net/jami/jams/authmodule/RegisterUserFlow.java b/authentication-module/src/main/java/net/jami/jams/authmodule/RegisterUserFlow.java index d7785b94f9c6e4cb522ab1f6830d392df11c6628..1ef63a4f58b63c4a6473fc86665607115c747dcd 100644 --- a/authentication-module/src/main/java/net/jami/jams/authmodule/RegisterUserFlow.java +++ b/authentication-module/src/main/java/net/jami/jams/authmodule/RegisterUserFlow.java @@ -1,6 +1,7 @@ package net.jami.jams.authmodule; import lombok.extern.slf4j.Slf4j; +import net.jami.jams.common.jami.NameRegistrationRequest; import net.jami.jams.common.jami.NameServer; import net.jami.jams.common.objects.roots.X509Fields; import net.jami.jams.common.objects.user.User; @@ -29,7 +30,10 @@ public class RegisterUserFlow { //Didn't exactly plan on this happening here, but this is the only place we actually need it. //Given an interface of NameServer, we need to enroll the user or decline the enrollement before //storing him - if(nameServer != null && nameServer.registerName(user.getUsername() ) != 200){ + NameRegistrationRequest nameRegistrationRequest = new NameRegistrationRequest(); + nameRegistrationRequest.setOwner(ethKeyPair[0]); + nameRegistrationRequest.setAddr(user.getJamiId()); + if(nameServer != null && nameServer.registerName(user.getUsername(), nameRegistrationRequest ) != 200){ return false; } datastore.getUserDao().storeObject(user); diff --git a/jams-common/src/main/java/module-info.java b/jams-common/src/main/java/module-info.java index 2d38ebbb834e208b2c9012c55da8726b85c1104f..353f1cfa42d4c94bb6e0b58906091357da252fb4 100644 --- a/jams-common/src/main/java/module-info.java +++ b/jams-common/src/main/java/module-info.java @@ -22,6 +22,7 @@ module jams.common { opens net.jami.jams.common.cryptoengineapi; opens net.jami.jams.common.utils; opens net.jami.jams.common.serialization; + opens net.jami.jams.common.jami; requires lombok; requires org.slf4j; requires org.bouncycastle.pkix; diff --git a/jams-common/src/main/java/net/jami/jams/common/jami/AddrLookupResponse.java b/jams-common/src/main/java/net/jami/jams/common/jami/AddrLookupResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..871626ca97ef969b93eb87adbf85f791070b6113 --- /dev/null +++ b/jams-common/src/main/java/net/jami/jams/common/jami/AddrLookupResponse.java @@ -0,0 +1,14 @@ +package net.jami.jams.common.jami; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class AddrLookupResponse { + private String name; +} diff --git a/jams-common/src/main/java/net/jami/jams/common/jami/NameLookupResponse.java b/jams-common/src/main/java/net/jami/jams/common/jami/NameLookupResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..977e0f9fd507a14c46022a10183f7ac5ab1e123e --- /dev/null +++ b/jams-common/src/main/java/net/jami/jams/common/jami/NameLookupResponse.java @@ -0,0 +1,13 @@ +package net.jami.jams.common.jami; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class NameLookupResponse { + private String name; + private String addr; + private String publickey; + private String signature; +} diff --git a/jams-common/src/main/java/net/jami/jams/common/jami/NameServer.java b/jams-common/src/main/java/net/jami/jams/common/jami/NameServer.java index 8e9a5ec17b843920f20fdbf88e1835b7cac48019..946ea86ccd832a53622a6865ab405b71e1756790 100644 --- a/jams-common/src/main/java/net/jami/jams/common/jami/NameServer.java +++ b/jams-common/src/main/java/net/jami/jams/common/jami/NameServer.java @@ -1,7 +1,7 @@ package net.jami.jams.common.jami; public interface NameServer { - Integer registerName(String username); - String getAddressFromName(String username); + Integer registerName(String username, NameRegistrationRequest nameRegistrationRequest); + NameLookupResponse getAddressFromName(String username); String getNameFromAddress(String address); } diff --git a/jams-server/src/main/java/net/jami/jams/server/Server.java b/jams-server/src/main/java/net/jami/jams/server/Server.java index 24119dbf81d2126b0f16e000e90460f4dbb41261..c4773a5c17319b0806869af961ad4cbb14f6b343 100644 --- a/jams-server/src/main/java/net/jami/jams/server/Server.java +++ b/jams-server/src/main/java/net/jami/jams/server/Server.java @@ -6,6 +6,7 @@ import net.jami.datastore.main.DataStore; import net.jami.jams.common.authentication.AuthenticationSourceType; import net.jami.jams.common.authmodule.AuthenticationModule; import net.jami.jams.common.cryptoengineapi.CertificateAuthority; +import net.jami.jams.common.jami.NameServer; import net.jami.jams.common.serialization.JsoniterRegistry; import net.jami.jams.common.server.ServerSettings; import net.jami.jams.common.utils.LibraryLoader; @@ -31,6 +32,7 @@ public class Server { //This one gets loaded via JAR, to make it more flexible. public static CertificateAuthority certificateAuthority; public static AuthenticationModule userAuthenticationModule; + public static NameServer nameServer; public static void main(String[] args) { //Start tomcat. @@ -61,6 +63,7 @@ public class Server { userAuthenticationModule.attachAuthSource(AuthenticationSourceType.AD, serverSettings.getActiveDirectoryConfiguration()); } + //init the nameserver here. } catch (Exception e){ log.error("Could not load configuration file or initialize some components - this is critical"); diff --git a/jams-server/src/main/java/net/jami/jams/server/core/jaminamserver/LocalNameServer.java b/jams-server/src/main/java/net/jami/jams/server/core/jaminamserver/LocalNameServer.java index e8990b76b381a41af928f5dab0e6a4aa70d8f31f..2505bba866fa3ee41514db9f83686a2a14eb101b 100644 --- a/jams-server/src/main/java/net/jami/jams/server/core/jaminamserver/LocalNameServer.java +++ b/jams-server/src/main/java/net/jami/jams/server/core/jaminamserver/LocalNameServer.java @@ -3,6 +3,8 @@ package net.jami.jams.server.core.jaminamserver; import lombok.extern.slf4j.Slf4j; import net.jami.jams.common.dao.StatementElement; import net.jami.jams.common.dao.StatementList; +import net.jami.jams.common.jami.NameLookupResponse; +import net.jami.jams.common.jami.NameRegistrationRequest; import net.jami.jams.common.jami.NameServer; import net.jami.jams.common.objects.user.User; @@ -14,19 +16,24 @@ import static net.jami.jams.server.Server.dataStore; public class LocalNameServer implements NameServer { //This always returns 200, for obvious reasons. + + @Override - public Integer registerName(String username) { + public Integer registerName(String username, NameRegistrationRequest nameRegistrationRequest) { return 200; } @Override - public String getAddressFromName(String username) { + public NameLookupResponse getAddressFromName(String username) { StatementList statementList = new StatementList(); StatementElement statementElement = new StatementElement("username","=",username,""); statementList.addStatement(statementElement); List<User> results = dataStore.getUserDao().getObjects(statementList); if(results.size() == 0) return null; - return results.get(0).getAddress(); + NameLookupResponse nameLookupResponse = new NameLookupResponse(); + nameLookupResponse.setName(results.get(0).getUsername()); + nameLookupResponse.setAddr(results.get(0).getJamiId()); + return nameLookupResponse; } @Override diff --git a/jams-server/src/main/java/net/jami/jams/server/core/jaminamserver/PublicNameServer.java b/jams-server/src/main/java/net/jami/jams/server/core/jaminamserver/PublicNameServer.java index eaa9eb42fb6d466b0061d996d009109f07595b04..d69c5fe39dc27fbb2b66a67372840485c5cd200f 100644 --- a/jams-server/src/main/java/net/jami/jams/server/core/jaminamserver/PublicNameServer.java +++ b/jams-server/src/main/java/net/jami/jams/server/core/jaminamserver/PublicNameServer.java @@ -1,6 +1,10 @@ package net.jami.jams.server.core.jaminamserver; +import com.jsoniter.JsonIterator; +import com.jsoniter.output.JsonStream; import lombok.extern.slf4j.Slf4j; +import net.jami.jams.common.jami.NameLookupResponse; +import net.jami.jams.common.jami.NameRegistrationRequest; import net.jami.jams.common.jami.NameServer; import java.net.HttpURLConnection; @@ -16,14 +20,13 @@ public class PublicNameServer implements NameServer { } @Override - public Integer registerName(String username) { + public Integer registerName(String username, NameRegistrationRequest nameRegistrationRequest) { try { - URL url = new URL(nameserverURI+"/"); + URL url = new URL(nameserverURI+"/name/" + username); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setRequestMethod("POST"); - con.connect(); - //Send the name registration request. - con.getOutputStream().write("".getBytes()); + con.setDoOutput(true); + con.getOutputStream().write(JsonStream.serialize(nameRegistrationRequest).getBytes()); return con.getResponseCode(); } catch (Exception e) { @@ -32,28 +35,52 @@ public class PublicNameServer implements NameServer { } @Override - public String getAddressFromName(String usernmae) { + public NameLookupResponse getAddressFromName(String username) { try { - URL url = new URL(nameserverURI+"/"); + URL url = new URL(nameserverURI+"/name/" + username); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setRequestMethod("GET"); + if(con.getResponseCode() == 200) { + StringBuilder responseData = new StringBuilder(); + int respSize = Integer.parseInt(con.getHeaderField("Content-Length")); + int currentSize = 0; + while (currentSize < respSize) { + responseData.append((char) con.getInputStream().read()); + currentSize++; + } + log.info("Reponse received from public nameserver {} ", responseData.toString()); + return JsonIterator.deserialize(responseData.toString(),NameLookupResponse.class); + } + return null; } catch (Exception e){ + log.info("An error occurred while querying the public nameserver {} ", e.toString()); return null; } - return null; } @Override public String getNameFromAddress(String address) { try { - URL url = new URL(nameserverURI+"/"); + URL url = new URL(nameserverURI+"/addr/" + address); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setRequestMethod("GET"); + if(con.getResponseCode() == 200) { + StringBuilder responseData = new StringBuilder(); + int respSize = Integer.parseInt(con.getHeaderField("Content-Length")); + int currentSize = 0; + while (currentSize < respSize) { + responseData.append((char) con.getInputStream().read()); + currentSize++; + } + log.info("Response received from public nameserver {} ",responseData.toString()); + return responseData.toString(); + } + return null; } catch (Exception e){ + log.info("An error occurred while querying the public nameserver {} ",e.toString()); return null; } - return null; } } diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/jaminameserver/AddressServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/jaminameserver/AddressServlet.java index 4977f4115f3c17eaed03509217cb601ab14af4d5..913a13ef7c9e1ef1138aa173a5adb85d25b5232e 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/jaminameserver/AddressServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/jaminameserver/AddressServlet.java @@ -1,19 +1,27 @@ package net.jami.jams.server.servlets.api.jaminameserver; +import com.jsoniter.output.JsonStream; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import net.jami.jams.common.jami.AddrLookupResponse; +import net.jami.jams.common.jami.NameLookupResponse; import java.io.IOException; +import static net.jami.jams.server.Server.nameServer; + @WebServlet("/api/nameservice/addr/*") public class AddressServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - super.doGet(req, resp); + String[] path = req.getServletPath().split("/"); + String username = nameServer.getNameFromAddress(path[path.length - 1]); + if(username == null) resp.sendError(404); + else resp.getOutputStream().write(JsonStream.serialize(new AddrLookupResponse(username)).getBytes()); } } diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/jaminameserver/NameServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/jaminameserver/NameServlet.java index ebfd3239623b2fffccad6fbb81a678bbfefe4df1..c9b8cdb9c1014512d6713eefabecb6a6d265cf4e 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/jaminameserver/NameServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/jaminameserver/NameServlet.java @@ -1,18 +1,25 @@ package net.jami.jams.server.servlets.api.jaminameserver; +import com.jsoniter.output.JsonStream; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import net.jami.jams.common.jami.NameLookupResponse; import java.io.IOException; +import static net.jami.jams.server.Server.nameServer; + @WebServlet("/api/nameservice/name/*") public class NameServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - super.doGet(req, resp); + String[] path = req.getServletPath().split("/"); + NameLookupResponse nameLookupResponse = nameServer.getAddressFromName(path[path.length - 1]); + if(nameLookupResponse == null) resp.sendError(404); + else resp.getOutputStream().write(JsonStream.serialize(nameLookupResponse).getBytes()); } } diff --git a/jams-server/src/test/java/net/jami/jams/server/core/jaminamserver/PublicNameServerTest.java b/jams-server/src/test/java/net/jami/jams/server/core/jaminamserver/PublicNameServerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..5064c102dbb2e6ed71d69c4dfc77f2512f4c76a5 --- /dev/null +++ b/jams-server/src/test/java/net/jami/jams/server/core/jaminamserver/PublicNameServerTest.java @@ -0,0 +1,48 @@ +package net.jami.jams.server.core.jaminamserver; + +import net.jami.jams.common.jami.NameLookupResponse; +import net.jami.jams.common.jami.NameRegistrationRequest; +import net.jami.jams.common.jami.NameServer; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; + +class PublicNameServerTest { + + private static NameServer nameServer; + + @BeforeAll + public static void init(){ + nameServer = new PublicNameServer("http://ns.jami.net"); + } + + @Test + public void testNameRegistration(){ + NameRegistrationRequest nameRegistrationRequest = new NameRegistrationRequest(); + nameRegistrationRequest.setAddr("0e76529938772ac7626552ab71"); + nameRegistrationRequest.setOwner("0x74ef2cD532a0f3cE31089b4fd296DDdFB5d6566A"); + nameRegistrationRequest.setSignature(null); + nameRegistrationRequest.setPublickey(null); + String name = UUID.randomUUID().toString().replace("-",""); + Integer res = nameServer.registerName(name,nameRegistrationRequest); + Assertions.assertEquals(200,res,"The response should have been 200!"); + } + + @Test + public void testNameLookUp(){ + NameLookupResponse resp = nameServer.getAddressFromName("sidokhine6"); + Assertions.assertNotNull(resp,"The response should exist!"); + } + + @Test + public void testAddrLookUp(){ + String addr = nameServer.getNameFromAddress("0d1f0002ce728d6aa8b98b5227c75fc773735f9e"); + Assertions.assertNotNull(addr,"The address should exist!"); + } + + +} \ No newline at end of file