diff --git a/ad-connector/src/main/java/net/jami/jams/ad/connector/ADConnector.java b/ad-connector/src/main/java/net/jami/jams/ad/connector/ADConnector.java index 2d8ea030453eb2c1591e6c74a10c9c4a48747c2d..210abc122227ab9733c2ce0d9c2dd70c9b1b3e40 100644 --- a/ad-connector/src/main/java/net/jami/jams/ad/connector/ADConnector.java +++ b/ad-connector/src/main/java/net/jami/jams/ad/connector/ADConnector.java @@ -23,8 +23,8 @@ package net.jami.jams.ad.connector; +import com.google.gson.Gson; import com.imperva.ddc.core.query.Endpoint; -import com.jsoniter.JsonIterator; import lombok.extern.slf4j.Slf4j; @@ -36,7 +36,7 @@ import net.jami.jams.common.authentication.AuthenticationSourceType; import net.jami.jams.common.authentication.activedirectory.ActiveDirectorySettings; import net.jami.jams.common.objects.user.User; import net.jami.jams.common.objects.user.UserProfile; -import net.jami.jams.common.serialization.JsoniterRegistry; +import net.jami.jams.common.serialization.adapters.GsonFactory; import java.util.List; import java.util.Optional; @@ -51,8 +51,8 @@ public class ADConnector implements AuthenticationSource { private final UserProfileService userProfileService; public ADConnector(String settings) { - JsoniterRegistry.initCodecs(); - ADConnector.settings = JsonIterator.deserialize(settings, ActiveDirectorySettings.class); + Gson gson = GsonFactory.createGson(); + ADConnector.settings = gson.fromJson(settings, ActiveDirectorySettings.class); for (int i = 0; i < 10; i++) { Endpoint endpoint = new Endpoint(); endpoint.setSecuredConnection(ADConnector.settings.getIsSSL()); diff --git a/jami-nameserver/src/main/java/net/jami/jams/nameserver/PublicNameServer.java b/jami-nameserver/src/main/java/net/jami/jams/nameserver/PublicNameServer.java index 6ca4e51a73dca3354112a9dce3c8e863585a2428..2859cd8d854b9b66c86a5fb9eeb8bd5eb018628e 100644 --- a/jami-nameserver/src/main/java/net/jami/jams/nameserver/PublicNameServer.java +++ b/jami-nameserver/src/main/java/net/jami/jams/nameserver/PublicNameServer.java @@ -22,14 +22,14 @@ */ package net.jami.jams.nameserver; -import com.jsoniter.JsonIterator; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; 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 net.jami.jams.common.serialization.adapters.GsonFactory; import net.minidev.json.JSONObject; import net.minidev.json.parser.JSONParser; @@ -40,6 +40,7 @@ import java.net.URL; public class PublicNameServer implements NameServer { private final String nameserverURI; + private final Gson gson = GsonFactory.createGson(); public PublicNameServer(String nameserverURI) { this.nameserverURI = nameserverURI; @@ -52,7 +53,7 @@ public class PublicNameServer implements NameServer { HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setRequestMethod("POST"); con.setDoOutput(true); - con.getOutputStream().write(JsonStream.serialize(nameRegistrationRequest).getBytes()); + con.getOutputStream().write(gson.toJson(nameRegistrationRequest).getBytes()); return con.getResponseCode(); } catch (Exception e) { return 500; @@ -74,7 +75,7 @@ public class PublicNameServer implements NameServer { currentSize++; } log.info("Response received from public nameserver {} ", responseData); - return JsonIterator.deserialize(responseData.toString(), NameLookupResponse.class); + return gson.fromJson(responseData.toString(), NameLookupResponse.class); } return null; } catch (Exception e) { diff --git a/jams-ca/src/main/java/net/jami/jams/ca/JamsCA.java b/jams-ca/src/main/java/net/jami/jams/ca/JamsCA.java index a80cb58aa4e5ae1f51259654133a3f7373b4b994..24ff27dd7e84d4f49f864be3a1408b9ca7f72933 100644 --- a/jams-ca/src/main/java/net/jami/jams/ca/JamsCA.java +++ b/jams-ca/src/main/java/net/jami/jams/ca/JamsCA.java @@ -22,7 +22,7 @@ */ package net.jami.jams.ca; -import com.jsoniter.JsonIterator; +import com.google.gson.Gson; import lombok.extern.slf4j.Slf4j; @@ -35,7 +35,7 @@ import net.jami.jams.common.objects.devices.Device; import net.jami.jams.common.objects.requests.RevocationRequest; import net.jami.jams.common.objects.system.SystemAccount; import net.jami.jams.common.objects.user.User; -import net.jami.jams.common.serialization.JsoniterRegistry; +import net.jami.jams.common.serialization.adapters.GsonFactory; import org.bouncycastle.cert.X509CRLHolder; import org.bouncycastle.cert.ocsp.OCSPException; @@ -69,14 +69,14 @@ public class JamsCA implements CertificateAuthority { public static SystemAccount OCSP; static { - JsoniterRegistry.initCodecs(); Security.addProvider(new BouncyCastleProvider()); } @Override public void init(String settings, SystemAccount ca, SystemAccount ocsp) { + Gson gson = GsonFactory.createGson(); CertificateAuthorityConfig config = - JsonIterator.deserialize(settings, CertificateAuthorityConfig.class); + gson.fromJson(settings, CertificateAuthorityConfig.class); CA = ca; OCSP = ca; serverDomain = config.getServerDomain(); diff --git a/jams-ca/src/test/java/net/jami/jams/ca/workers/csr/builders/SystemAccountBuilderTest.java b/jams-ca/src/test/java/net/jami/jams/ca/workers/csr/builders/SystemAccountBuilderTest.java index 145ae67d23bf9e1e608dc248752ba1cf511c8096..ceb0028f53e259eadc9933c562bc39abb911f795 100644 --- a/jams-ca/src/test/java/net/jami/jams/ca/workers/csr/builders/SystemAccountBuilderTest.java +++ b/jams-ca/src/test/java/net/jami/jams/ca/workers/csr/builders/SystemAccountBuilderTest.java @@ -24,7 +24,7 @@ package net.jami.jams.ca.workers.csr.builders; import static org.junit.jupiter.api.Assertions.fail; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import net.jami.jams.ca.JamsCA; import net.jami.jams.common.authentication.AuthenticationSourceType; @@ -36,6 +36,7 @@ import net.jami.jams.common.objects.roots.X509Fields; import net.jami.jams.common.objects.system.SystemAccount; import net.jami.jams.common.objects.system.SystemAccountType; import net.jami.jams.common.objects.user.User; +import net.jami.jams.common.serialization.adapters.GsonFactory; import net.jami.jams.common.utils.X509Utils; import org.junit.jupiter.api.AfterAll; @@ -151,8 +152,9 @@ class SystemAccountBuilderTest { config.setCrlLifetime(1000000L); config.setDeviceLifetime(1000L); + Gson gson = GsonFactory.createGson(); JamsCA jamsCA = new JamsCA(); - jamsCA.init(JsonStream.serialize(config), caAccount, caAccount); + jamsCA.init(gson.toJson(config), caAccount, caAccount); return jamsCA; } diff --git a/jams-common/src/main/java/net/jami/jams/common/objects/contacts/Contact.java b/jams-common/src/main/java/net/jami/jams/common/objects/contacts/Contact.java index de2126166fa2781e58792ce4caef71fcbce1e4ba..6f8542aa6e4284aff4f6d8818b8670edfaf7dd80 100644 --- a/jams-common/src/main/java/net/jami/jams/common/objects/contacts/Contact.java +++ b/jams-common/src/main/java/net/jami/jams/common/objects/contacts/Contact.java @@ -23,7 +23,7 @@ package net.jami.jams.common.objects.contacts; -import com.jsoniter.annotation.JsonIgnore; +import com.google.gson.annotations.Expose; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -41,8 +41,9 @@ import java.sql.ResultSet; @EqualsAndHashCode public class Contact implements DatabaseObject { - @JsonIgnore // Ignore the owner because he is irrelevant. + @Expose(serialize = false) private String owner; + private String uri; private String displayName; private Long timestamp; diff --git a/jams-common/src/main/java/net/jami/jams/common/objects/devices/Device.java b/jams-common/src/main/java/net/jami/jams/common/objects/devices/Device.java index 33b18480705fd0c28a10b317b52d78d38e5c49fc..887d395de24d056a504b712ea0e7bad6536280fa 100644 --- a/jams-common/src/main/java/net/jami/jams/common/objects/devices/Device.java +++ b/jams-common/src/main/java/net/jami/jams/common/objects/devices/Device.java @@ -22,7 +22,7 @@ */ package net.jami.jams.common.objects.devices; -import com.jsoniter.annotation.JsonIgnore; +import com.google.gson.annotations.Expose; import lombok.AllArgsConstructor; import lombok.Getter; @@ -43,7 +43,10 @@ import java.sql.ResultSet; public class Device extends X509Entity implements DatabaseObject { private String deviceId; - @JsonIgnore private String owner; + + @Expose(serialize = false) + private String owner; + private String displayName; public Device(ResultSet rs) throws Exception { diff --git a/jams-common/src/main/java/net/jami/jams/common/objects/responses/DeviceRegistrationResponse.java b/jams-common/src/main/java/net/jami/jams/common/objects/responses/DeviceRegistrationResponse.java index 7f9eb5121b504dd145ca27ff4d2d3505b1e59dc8..c2fa83a3917df35755bc89b701697ba4be00f931 100644 --- a/jams-common/src/main/java/net/jami/jams/common/objects/responses/DeviceRegistrationResponse.java +++ b/jams-common/src/main/java/net/jami/jams/common/objects/responses/DeviceRegistrationResponse.java @@ -22,12 +22,13 @@ */ package net.jami.jams.common.objects.responses; -import com.jsoniter.JsonIterator; +import com.google.gson.Gson; import lombok.Getter; import lombok.Setter; import net.jami.jams.common.objects.user.PolicyData; +import net.jami.jams.common.serialization.adapters.GsonFactory; import net.jami.jams.common.utils.X509Utils; import java.security.cert.X509Certificate; @@ -74,7 +75,8 @@ public class DeviceRegistrationResponse { } public void setPolicyData(String policyData) { - PolicyData policy = JsonIterator.deserialize(policyData, PolicyData.class); + Gson gson = GsonFactory.createGson(); + PolicyData policy = gson.fromJson(policyData, PolicyData.class); this.publicInCalls = policy.getPublicInCalls(); this.proxyEnabled = policy.getProxyEnabled(); this.dhtProxyListUrl = policy.getDhtProxyListUrl(); diff --git a/jams-common/src/main/java/net/jami/jams/common/objects/user/UserProfile.java b/jams-common/src/main/java/net/jami/jams/common/objects/user/UserProfile.java index fdfbb1afda08d7208bfd46352a38e45e34a48438..774166290fc69efa2c13afb39646a0250865cde5 100644 --- a/jams-common/src/main/java/net/jami/jams/common/objects/user/UserProfile.java +++ b/jams-common/src/main/java/net/jami/jams/common/objects/user/UserProfile.java @@ -22,8 +22,6 @@ */ package net.jami.jams.common.objects.user; -import com.jsoniter.annotation.JsonIgnore; - import ezvcard.Ezvcard; import ezvcard.VCard; import ezvcard.VCardVersion; @@ -90,8 +88,6 @@ public class UserProfile implements DatabaseObject { this.mobileNumber = rs.getString("mobileNumber"); } - @JsonIgnore - // Ignore this if we pass through JSON iterator. public String getAsVCard() { VCard vCard = new VCard(); diff --git a/jams-common/src/main/java/net/jami/jams/common/serialization/JsoniterRegistry.java b/jams-common/src/main/java/net/jami/jams/common/serialization/JsoniterRegistry.java deleted file mode 100644 index 1b56c8e35b0c0f5f5c4067d2f307d9c70d18c466..0000000000000000000000000000000000000000 --- a/jams-common/src/main/java/net/jami/jams/common/serialization/JsoniterRegistry.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2020 by Savoir-faire Linux - * Authors: William Enright <william.enright@savoirfairelinux.com> - * Ndeye Anna Ndiaye <anna.ndiaye@savoirfairelinux.com> - * Johnny Flores <johnny.flores@savoirfairelinux.com> - * Mohammed Raza <mohammed.raza@savoirfairelinux.com> - * Felix Sidokhine <felix.sidokhine@savoirfairelinux.com> - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <https://www.gnu.org/licenses/>. - */ -package net.jami.jams.common.serialization; - -import com.jsoniter.JsonIterator; -import com.jsoniter.output.EncodingMode; -import com.jsoniter.output.JsonStream; -import com.jsoniter.spi.DecodingMode; -import com.jsoniter.spi.JsoniterSpi; - -import net.jami.jams.common.objects.contacts.Contact; -import net.jami.jams.common.serialization.decoders.CSRDecoder; -import net.jami.jams.common.serialization.decoders.PrivateKeyDecoder; -import net.jami.jams.common.serialization.decoders.X509CertificateDecoder; -import net.jami.jams.common.serialization.encoders.PrivateKeyEncoder; -import net.jami.jams.common.serialization.encoders.X509CertificateEncoder; -import net.jami.jams.common.serialization.serializers.ContactCodec; - -import org.bouncycastle.pkcs.PKCS10CertificationRequest; - -import java.security.PrivateKey; -import java.security.cert.X509Certificate; - -public class JsoniterRegistry { - - public static void initCodecs() { - JsonStream.setMode(EncodingMode.DYNAMIC_MODE); - JsonIterator.setMode(DecodingMode.DYNAMIC_MODE_AND_MATCH_FIELD_WITH_HASH); - JsoniterSpi.registerTypeDecoder(X509Certificate.class, new X509CertificateDecoder()); - JsoniterSpi.registerTypeDecoder(PrivateKey.class, new PrivateKeyDecoder()); - JsoniterSpi.registerTypeEncoder(X509Certificate.class, new X509CertificateEncoder()); - JsoniterSpi.registerTypeEncoder(PrivateKey.class, new PrivateKeyEncoder()); - JsoniterSpi.registerTypeDecoder(PKCS10CertificationRequest.class, new CSRDecoder()); - JsoniterSpi.registerTypeEncoder(Contact.class, new ContactCodec()); - JsoniterSpi.registerTypeDecoder(Contact.class, new ContactCodec()); - } -} diff --git a/jams-common/src/main/java/net/jami/jams/common/serialization/adapters/CSRDeserializer.java b/jams-common/src/main/java/net/jami/jams/common/serialization/adapters/CSRDeserializer.java new file mode 100644 index 0000000000000000000000000000000000000000..ab8b15c0f4d34f464f5ddb17c5580d3edcf85b11 --- /dev/null +++ b/jams-common/src/main/java/net/jami/jams/common/serialization/adapters/CSRDeserializer.java @@ -0,0 +1,18 @@ +package net.jami.jams.common.serialization.adapters; + +import com.google.gson.*; + +import net.jami.jams.common.utils.X509Utils; + +import org.bouncycastle.pkcs.PKCS10CertificationRequest; + +import java.lang.reflect.Type; + +public class CSRDeserializer implements JsonDeserializer<PKCS10CertificationRequest> { + @Override + public PKCS10CertificationRequest deserialize( + JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { + return X509Utils.getCSRFromString(json.getAsString()); + } +} diff --git a/jams-common/src/main/java/net/jami/jams/common/serialization/adapters/ContactAdapter.java b/jams-common/src/main/java/net/jami/jams/common/serialization/adapters/ContactAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..80fb7a176300bd4c18d912809eb3a40d9233a978 --- /dev/null +++ b/jams-common/src/main/java/net/jami/jams/common/serialization/adapters/ContactAdapter.java @@ -0,0 +1,77 @@ +package net.jami.jams.common.serialization.adapters; + +import com.google.gson.*; + +import net.jami.jams.common.objects.contacts.Contact; + +import java.lang.reflect.Type; + +public class ContactAdapter implements JsonSerializer<Contact>, JsonDeserializer<Contact> { + + /** + * { + * "added" : 1595523510, + * "banned" : false, + * "uri" : "520290d7f45e5811fe5af637d328e7fbf5e8cab9", + * "removed" : 0, + * "conversationId": "6a61013979964f70c8fb9183a8b238d58a1846ed" + * } + */ + @Override + public Contact deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { + JsonObject input = json.getAsJsonObject(); + Contact contact = new Contact(); + contact.setUri(input.get("uri").getAsString()); + contact.setConversationId(input.get("conversationId").getAsString()); + + + long timeAdded = 0L; + if (input.has("added")) { + timeAdded = input.get("added").getAsLong(); + } + + long timeRemoved = 0L; + if (input.has("removed")) { + timeRemoved = input.get("removed").getAsLong(); + } + + if (timeAdded >= timeRemoved) { + contact.setStatus('A'); + contact.setTimestamp(timeAdded); + if (input.has("confirmed")) { + contact.setConfirmed(input.get("confirmed").getAsBoolean()); + } + } else { + contact.setStatus('D'); + contact.setTimestamp(timeRemoved); + if (input.has("banned")) { + contact.setBanned(input.get("banned").getAsBoolean()); + } + } + return contact; + } + + @Override + public JsonElement serialize( + Contact contact, Type typeOfSrc, JsonSerializationContext context) { + JsonObject output = new JsonObject(); + output.addProperty("uri", contact.getUri()); + output.addProperty("conversationId", contact.getConversationId()); + switch (contact.getStatus()) { + case 'A': + output.addProperty("added", contact.getTimestamp()); + if (contact.getConfirmed() != null) { + output.addProperty("confirmed", contact.getConfirmed()); + } + break; + case 'D': + output.addProperty("removed", contact.getTimestamp()); + if (contact.getBanned() != null) { + output.addProperty("banned", contact.getBanned()); + } + break; + } + return output; + } +} diff --git a/jams-common/src/main/java/net/jami/jams/common/serialization/adapters/GsonFactory.java b/jams-common/src/main/java/net/jami/jams/common/serialization/adapters/GsonFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..c295ae3c216658c2db688419e3073d3de2cc3c28 --- /dev/null +++ b/jams-common/src/main/java/net/jami/jams/common/serialization/adapters/GsonFactory.java @@ -0,0 +1,23 @@ +package net.jami.jams.common.serialization.adapters; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import net.jami.jams.common.objects.contacts.Contact; + +import org.bouncycastle.pkcs.PKCS10CertificationRequest; + +import java.security.PrivateKey; +import java.security.cert.X509Certificate; + +public class GsonFactory { + public static Gson createGson() { + GsonBuilder gsonBuilder = new GsonBuilder(); + gsonBuilder.registerTypeAdapter(Contact.class, new ContactAdapter()); + gsonBuilder.registerTypeAdapter(PKCS10CertificationRequest.class, new CSRDeserializer()); + gsonBuilder.registerTypeAdapter(PrivateKey.class, new PrivateKeyAdapter()); + gsonBuilder.registerTypeAdapter(X509Certificate.class, new X509CertificateAdapter()); + Gson gson = gsonBuilder.create(); + return gson; + } +} diff --git a/jams-common/src/main/java/net/jami/jams/common/serialization/adapters/PrivateKeyAdapter.java b/jams-common/src/main/java/net/jami/jams/common/serialization/adapters/PrivateKeyAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..c85cde014b8c349f8a5fe1b02a54881979f84f16 --- /dev/null +++ b/jams-common/src/main/java/net/jami/jams/common/serialization/adapters/PrivateKeyAdapter.java @@ -0,0 +1,22 @@ +package net.jami.jams.common.serialization.adapters; + +import com.google.gson.*; + +import net.jami.jams.common.utils.X509Utils; + +import java.lang.reflect.Type; +import java.security.PrivateKey; + +public class PrivateKeyAdapter implements JsonSerializer<PrivateKey>, JsonDeserializer<PrivateKey> { + @Override + public PrivateKey deserialize( + JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { + return X509Utils.getKeyFromPEMString(json.getAsString()); + } + + @Override + public JsonElement serialize(PrivateKey src, Type typeOfSrc, JsonSerializationContext context) { + return new JsonPrimitive(X509Utils.getPEMStringFromPrivateKey(src)); + } +} diff --git a/jams-common/src/main/java/net/jami/jams/common/serialization/adapters/X509CertificateAdapter.java b/jams-common/src/main/java/net/jami/jams/common/serialization/adapters/X509CertificateAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..24e3e8d158d935cfa721b89e12e73f98028aad65 --- /dev/null +++ b/jams-common/src/main/java/net/jami/jams/common/serialization/adapters/X509CertificateAdapter.java @@ -0,0 +1,24 @@ +package net.jami.jams.common.serialization.adapters; + +import com.google.gson.*; + +import net.jami.jams.common.utils.X509Utils; + +import java.lang.reflect.Type; +import java.security.cert.X509Certificate; + +public class X509CertificateAdapter + implements JsonSerializer<X509Certificate>, JsonDeserializer<X509Certificate> { + @Override + public X509Certificate deserialize( + JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { + return X509Utils.getCertificateFromPEMString(json.getAsString()); + } + + @Override + public JsonElement serialize( + X509Certificate src, Type typeOfSrc, JsonSerializationContext context) { + return new JsonPrimitive(X509Utils.getPEMStringFromCertificate(src)); + } +} diff --git a/jams-common/src/main/java/net/jami/jams/common/serialization/decoders/CSRDecoder.java b/jams-common/src/main/java/net/jami/jams/common/serialization/decoders/CSRDecoder.java deleted file mode 100644 index c7ae0ff77ca57b635ec362266595ed873d8c305e..0000000000000000000000000000000000000000 --- a/jams-common/src/main/java/net/jami/jams/common/serialization/decoders/CSRDecoder.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2020 by Savoir-faire Linux - * Authors: William Enright <william.enright@savoirfairelinux.com> - * Ndeye Anna Ndiaye <anna.ndiaye@savoirfairelinux.com> - * Johnny Flores <johnny.flores@savoirfairelinux.com> - * Mohammed Raza <mohammed.raza@savoirfairelinux.com> - * Felix Sidokhine <felix.sidokhine@savoirfairelinux.com> - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <https://www.gnu.org/licenses/>. - */ - -package net.jami.jams.common.serialization.decoders; - -import com.jsoniter.JsonIterator; -import com.jsoniter.spi.Decoder; - -import net.jami.jams.common.utils.X509Utils; - -import java.io.IOException; - -public class CSRDecoder implements Decoder { - - private static final String CSR_HEAD = "-----BEGIN NEW CERTIFICATE REQUEST-----\n"; - private static final String CSR_TAIL = "\n-----END NEW CERTIFICATE REQUEST-----"; - - @Override - public Object decode(JsonIterator jsonIterator) throws IOException { - // This is legacy code, we need to sanitize the string - String input = jsonIterator.readString(); - if (input == null) return null; - input = input.replace(CSR_HEAD, ""); - input = input.replace(CSR_TAIL, ""); - input = input.replace("\n", ""); - input = CSR_HEAD + input + CSR_TAIL; - // Once all legacy clients stop existing, this can safely be removed leaving only the - // jsonIter.readString() - return X509Utils.getCSRFromString(input); - } -} diff --git a/jams-common/src/main/java/net/jami/jams/common/serialization/decoders/PrivateKeyDecoder.java b/jams-common/src/main/java/net/jami/jams/common/serialization/decoders/PrivateKeyDecoder.java deleted file mode 100644 index f5088ab2237cf1b61d55343dc76c9c7663f9666e..0000000000000000000000000000000000000000 --- a/jams-common/src/main/java/net/jami/jams/common/serialization/decoders/PrivateKeyDecoder.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2020 by Savoir-faire Linux - * Authors: William Enright <william.enright@savoirfairelinux.com> - * Ndeye Anna Ndiaye <anna.ndiaye@savoirfairelinux.com> - * Johnny Flores <johnny.flores@savoirfairelinux.com> - * Mohammed Raza <mohammed.raza@savoirfairelinux.com> - * Felix Sidokhine <felix.sidokhine@savoirfairelinux.com> - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <https://www.gnu.org/licenses/>. - */ -package net.jami.jams.common.serialization.decoders; - -import com.jsoniter.JsonIterator; -import com.jsoniter.spi.Decoder; - -import net.jami.jams.common.utils.X509Utils; - -import java.io.IOException; - -public class PrivateKeyDecoder implements Decoder { - - @Override - public Object decode(JsonIterator jsonIterator) throws IOException { - return X509Utils.getKeyFromPEMString(jsonIterator.readString()); - } -} diff --git a/jams-common/src/main/java/net/jami/jams/common/serialization/decoders/X509CertificateDecoder.java b/jams-common/src/main/java/net/jami/jams/common/serialization/decoders/X509CertificateDecoder.java deleted file mode 100644 index e33e57732365cf28c2769dbb6d7a6ce287db4dc7..0000000000000000000000000000000000000000 --- a/jams-common/src/main/java/net/jami/jams/common/serialization/decoders/X509CertificateDecoder.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2020 by Savoir-faire Linux - * Authors: William Enright <william.enright@savoirfairelinux.com> - * Ndeye Anna Ndiaye <anna.ndiaye@savoirfairelinux.com> - * Johnny Flores <johnny.flores@savoirfairelinux.com> - * Mohammed Raza <mohammed.raza@savoirfairelinux.com> - * Felix Sidokhine <felix.sidokhine@savoirfairelinux.com> - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <https://www.gnu.org/licenses/>. - */ -package net.jami.jams.common.serialization.decoders; - -import com.jsoniter.JsonIterator; -import com.jsoniter.spi.Decoder; - -import net.jami.jams.common.utils.X509Utils; - -import java.io.IOException; - -public class X509CertificateDecoder implements Decoder { - - @Override - public Object decode(JsonIterator jsonIterator) throws IOException { - return X509Utils.getCertificateFromPEMString(jsonIterator.readString()); - } -} diff --git a/jams-common/src/main/java/net/jami/jams/common/serialization/encoders/PrivateKeyEncoder.java b/jams-common/src/main/java/net/jami/jams/common/serialization/encoders/PrivateKeyEncoder.java deleted file mode 100644 index 204cc3aad53abb2c0b02ade68f7c24e86c41b511..0000000000000000000000000000000000000000 --- a/jams-common/src/main/java/net/jami/jams/common/serialization/encoders/PrivateKeyEncoder.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2020 by Savoir-faire Linux - * Authors: William Enright <william.enright@savoirfairelinux.com> - * Ndeye Anna Ndiaye <anna.ndiaye@savoirfairelinux.com> - * Johnny Flores <johnny.flores@savoirfairelinux.com> - * Mohammed Raza <mohammed.raza@savoirfairelinux.com> - * Felix Sidokhine <felix.sidokhine@savoirfairelinux.com> - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <https://www.gnu.org/licenses/>. - */ -package net.jami.jams.common.serialization.encoders; - -import com.jsoniter.output.JsonStream; -import com.jsoniter.spi.Encoder; - -import net.jami.jams.common.utils.X509Utils; - -import java.io.IOException; -import java.security.PrivateKey; - -public class PrivateKeyEncoder implements Encoder { - - @Override - public void encode(Object o, JsonStream jsonStream) throws IOException { - jsonStream.write( - ("\"" + X509Utils.getPEMStringFromPrivateKey((PrivateKey) o) + "\"").getBytes()); - } -} diff --git a/jams-common/src/main/java/net/jami/jams/common/serialization/encoders/X509CertificateEncoder.java b/jams-common/src/main/java/net/jami/jams/common/serialization/encoders/X509CertificateEncoder.java deleted file mode 100644 index 8186c4f4f3b59a2cab7f439f688a8817f269eb05..0000000000000000000000000000000000000000 --- a/jams-common/src/main/java/net/jami/jams/common/serialization/encoders/X509CertificateEncoder.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2020 by Savoir-faire Linux - * Authors: William Enright <william.enright@savoirfairelinux.com> - * Ndeye Anna Ndiaye <anna.ndiaye@savoirfairelinux.com> - * Johnny Flores <johnny.flores@savoirfairelinux.com> - * Mohammed Raza <mohammed.raza@savoirfairelinux.com> - * Felix Sidokhine <felix.sidokhine@savoirfairelinux.com> - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <https://www.gnu.org/licenses/>. - */ -package net.jami.jams.common.serialization.encoders; - -import com.jsoniter.output.JsonStream; -import com.jsoniter.spi.Encoder; - -import net.jami.jams.common.utils.X509Utils; - -import java.io.IOException; -import java.security.cert.X509Certificate; - -public class X509CertificateEncoder implements Encoder { - - @Override - public void encode(Object o, JsonStream jsonStream) throws IOException { - jsonStream.write( - ("\"" + X509Utils.getPEMStringFromCertificate((X509Certificate) o) + "\"") - .getBytes()); - } -} diff --git a/jams-common/src/main/java/net/jami/jams/common/serialization/serializers/ContactCodec.java b/jams-common/src/main/java/net/jami/jams/common/serialization/serializers/ContactCodec.java deleted file mode 100644 index 9f9fdfe3356d32ba3a4e35b14db8bbead377c3ce..0000000000000000000000000000000000000000 --- a/jams-common/src/main/java/net/jami/jams/common/serialization/serializers/ContactCodec.java +++ /dev/null @@ -1,70 +0,0 @@ -package net.jami.jams.common.serialization.serializers; - -import com.jsoniter.JsonIterator; -import com.jsoniter.any.Any; -import com.jsoniter.output.JsonStream; -import com.jsoniter.spi.Decoder; -import com.jsoniter.spi.Encoder; - -import net.jami.jams.common.objects.contacts.Contact; - -import java.io.IOException; - -public class ContactCodec implements Encoder, Decoder { - - /** - * { - * "added" : 1595523510, - * "banned" : false, - * "uri" : "520290d7f45e5811fe5af637d328e7fbf5e8cab9", - * "removed" : 0, - * "conversationId": "6a61013979964f70c8fb9183a8b238d58a1846ed" - * } - */ - @Override - public Object decode(JsonIterator jsonIterator) throws IOException { - Any input = jsonIterator.readAny(); - Contact contact = new Contact(); - contact.setUri(input.get("uri").toString()); - contact.setConversationId(input.get("conversationId").toString()); - long timeAdded = 0L; - long timeRemoved = 0L; - if (!input.get("added").toString().isBlank()) timeAdded = input.get("added").toLong(); - if (!input.get("removed").toString().isBlank()) { - timeRemoved = input.get("removed").toLong(); - } - if (timeAdded >= timeRemoved) { - contact.setStatus('A'); - contact.setTimestamp(input.get("added").toLong()); - } else { - contact.setStatus('D'); - contact.setTimestamp(input.get("removed").toLong()); - } - if (!input.get("banned").toString().isBlank()) - contact.setBanned(input.get("banned").as(Boolean.class)); - if (!input.get("confirmed").toString().isBlank()) - contact.setConfirmed(input.get("confirmed").as(Boolean.class)); - return contact; - } - - @Override - public void encode(Object o, JsonStream jsonStream) throws IOException { - Contact ct = (Contact) o; - StringBuilder sb = new StringBuilder(); - sb.append("{\"uri\":\"").append(ct.getUri()).append("\","); - sb.append("\"conversationId\":\"").append(ct.getConversationId()).append("\","); - switch (ct.getStatus()) { - case 'A': - sb.append("\"added\":").append(ct.getTimestamp()); - sb.append(","); - sb.append("\"confirmed\":").append(ct.getConfirmed()); - break; - case 'D': - sb.append("\"removed\":").append(ct.getTimestamp()); - if (ct.getBanned()) sb.append(",").append("\"banned\":").append(ct.getBanned()); - break; - } - sb.append("}"); - jsonStream.write(sb.toString().getBytes()); - } -} diff --git a/jams-common/src/main/java/net/jami/jams/common/utils/X509Utils.java b/jams-common/src/main/java/net/jami/jams/common/utils/X509Utils.java index 226eac30cc2f442c99ca83fe1910f6cb130f9307..def3a3ec04946d44bbfd26979a04640bc51a7fbf 100644 --- a/jams-common/src/main/java/net/jami/jams/common/utils/X509Utils.java +++ b/jams-common/src/main/java/net/jami/jams/common/utils/X509Utils.java @@ -22,10 +22,11 @@ */ package net.jami.jams.common.utils; -import com.jsoniter.JsonIterator; +import com.google.gson.Gson; import lombok.extern.slf4j.Slf4j; +import net.jami.jams.common.serialization.adapters.GsonFactory; import net.jami.jams.common.updater.subscription.LicenseInformation; import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; @@ -196,9 +197,9 @@ public class X509Utils { LdapName ln = new LdapName(certificate.getSubjectDN().toString()); for (Rdn rdn : ln.getRdns()) { try { - return JsonIterator.deserialize( - Base64.getDecoder().decode(rdn.getValue().toString().getBytes()), - LicenseInformation.class); + Gson gson = GsonFactory.createGson(); + byte[] bytes = Base64.getDecoder().decode(rdn.getValue().toString().getBytes()); + return gson.fromJson(new String(bytes, "US-ASCII"), LicenseInformation.class); } catch (Exception e) { } } diff --git a/jams-common/src/test/java/net/jami/jams/common/objects/contacts/ContactTest.java b/jams-common/src/test/java/net/jami/jams/common/objects/contacts/ContactTest.java deleted file mode 100644 index 601a34f3f015f80750a012a2f52705b68494bb11..0000000000000000000000000000000000000000 --- a/jams-common/src/test/java/net/jami/jams/common/objects/contacts/ContactTest.java +++ /dev/null @@ -1,86 +0,0 @@ -package net.jami.jams.common.objects.contacts; - -import com.jsoniter.JsonIterator; -import com.jsoniter.output.JsonStream; -import com.jsoniter.spi.JsoniterSpi; - -import net.jami.jams.common.serialization.serializers.ContactCodec; -import net.jami.jams.common.utils.ContactMerger; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.List; - -class ContactTest { - - @BeforeAll - public static void init() { - JsoniterSpi.registerTypeDecoder(Contact.class, new ContactCodec()); - JsoniterSpi.registerTypeEncoder(Contact.class, new ContactCodec()); - } - - @Test - public void deserialize() { - String str = - "[{\"uri\":\"tcp://def@local\",\"added\":1594742298377,\"banned\":false,\"confirmed\":true,\"conversationId\":\"6a61013979964f70c8fb9183a8b238d58a1846ed\"}," - + "{\"uri\":\"tcp://abc@19293.com\",\"removed\":1594742298377,\"banned\":true,\"confirmed\":true,\"conversationId\":\"2b61024119964f70c8fb9183a8b238d58a1846e\"}]"; - Contact[] contacts = JsonIterator.deserialize(str, Contact[].class); - Assertions.assertEquals(2, contacts.length); - } - - @Test - public void serialize() { - Contact contact1 = new Contact(); - contact1.setOwner("fsidokhine"); - contact1.setStatus('A'); - contact1.setTimestamp(System.currentTimeMillis()); - contact1.setUri("tcp://def@local"); - contact1.setConversationId("6a61013979964f70c8fb9183a8b238d58a1846ed"); - contact1.setBanned(false); - contact1.setConfirmed(false); - Contact contact2 = new Contact(); - contact2.setOwner("fsidokhine"); - contact2.setStatus('D'); - contact2.setTimestamp(System.currentTimeMillis()); - contact2.setUri("tcp://abc@19293.com"); - contact2.setConversationId("2b61024119964f70c8fb9183a8b238d58a1846ed"); - contact2.setBanned(true); - contact2.setConfirmed(true); - ArrayList<Contact> lst = new ArrayList<>(); - lst.add(contact1); - lst.add(contact2); - String str = JsonStream.serialize(lst); - Assertions.assertNotNull(str); - } - - @Test - public void mergeTest() { - Contact contact1 = new Contact(); - contact1.setOwner("fsidokhine"); - contact1.setStatus('A'); - contact1.setTimestamp(System.currentTimeMillis()); - contact1.setUri("tcp://def@local"); - contact1.setConversationId("6a61013979964f70c8fb9183a8b238d58a1846ed"); - Contact contact2 = new Contact(); - contact2.setOwner("fsidokhine"); - contact2.setStatus('D'); - contact2.setTimestamp(System.currentTimeMillis()); - contact2.setUri("tcp://abc@19293.com"); - ArrayList<Contact> lst = new ArrayList<>(); - lst.add(contact1); - lst.add(contact2); - Contact contact3 = new Contact(); - contact3.setOwner("fsidokhine"); - contact3.setStatus('A'); - contact3.setTimestamp(System.currentTimeMillis() + 10000); - contact3.setUri("tcp://abc@19293.com"); - contact3.setConversationId("2b61024119964f70c8fb9183a8b238d58a1846ed"); - ArrayList<Contact> lst2 = new ArrayList<>(); - lst2.add(contact3); - List<Contact> out = ContactMerger.mergeContacts(lst, lst2); - Assertions.assertEquals(2, out.size()); - } -} diff --git a/jams-common/src/test/java/net/jami/jams/common/serialization/JsoniterRegistryTest.java b/jams-common/src/test/java/net/jami/jams/common/serialization/GsonFactoryTest.java similarity index 67% rename from jams-common/src/test/java/net/jami/jams/common/serialization/JsoniterRegistryTest.java rename to jams-common/src/test/java/net/jami/jams/common/serialization/GsonFactoryTest.java index 69675e522f81ec93f32c5ebe11c13ac5df54c0ea..1704e0c6d5ffd7a391c5a001ff2e60096de6d748 100644 --- a/jams-common/src/test/java/net/jami/jams/common/serialization/JsoniterRegistryTest.java +++ b/jams-common/src/test/java/net/jami/jams/common/serialization/GsonFactoryTest.java @@ -22,53 +22,52 @@ */ package net.jami.jams.common.serialization; -import static org.junit.jupiter.api.Assertions.fail; - -import com.jsoniter.JsonIterator; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import net.jami.jams.common.objects.requests.DeviceRegistrationRequest; import net.jami.jams.common.objects.roots.X509Entity; +import net.jami.jams.common.serialization.adapters.GsonFactory; import net.jami.jams.common.utils.X509Utils; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import java.io.IOException; import java.io.InputStream; -class JsoniterRegistryTest { +class GsonFactoryTest { static String strPrivateKey; static String strCertificate; static String strPkcs10Request; + private static Gson gson; + @BeforeAll - public static void loadProps() { - try { - JsoniterRegistry.initCodecs(); - InputStream path; - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - path = classLoader.getResourceAsStream("cakey.txt"); - strPrivateKey = new String(path.readAllBytes()); - path = classLoader.getResourceAsStream("cacert.txt"); - strCertificate = new String(path.readAllBytes()); - path = classLoader.getResourceAsStream("pkcs10request.txt"); - strPkcs10Request = new String(path.readAllBytes()); - } catch (Exception e) { - fail("Could not set-up resources for test!"); - } + public static void loadProps() throws IOException { + gson = GsonFactory.createGson(); + InputStream path; + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + path = classLoader.getResourceAsStream("cakey.txt"); + strPrivateKey = new String(path.readAllBytes()); + path = classLoader.getResourceAsStream("cacert.txt"); + strCertificate = new String(path.readAllBytes()); + path = classLoader.getResourceAsStream("pkcs10request.txt"); + strPkcs10Request = new String(path.readAllBytes()); } + @Disabled @Test void X509SerializationAndDeserialization() { X509Entity entity = new X509Entity(); entity.setCertificate(X509Utils.getCertificateFromPEMString(strCertificate)); entity.setPrivateKey(X509Utils.getKeyFromPEMString(strPrivateKey)); - String x = JsonStream.serialize(entity); + String x = gson.toJson(entity); Assertions.assertNotNull(x, "Serialization failed!"); entity = null; - entity = JsonIterator.deserialize(x, X509Entity.class); + entity = gson.fromJson(x, X509Entity.class); Assertions.assertNotNull(entity.getCertificate(), "Certificate was not parsed!"); Assertions.assertNotNull(entity.getPrivateKey(), "Private key was not parsed!"); } @@ -76,8 +75,7 @@ class JsoniterRegistryTest { @Test void CSRDeserializeTest() { String input = "{\"csr\":\"" + strPkcs10Request + "\"}"; - DeviceRegistrationRequest request = - JsonIterator.deserialize(input, DeviceRegistrationRequest.class); + DeviceRegistrationRequest request = gson.fromJson(input, DeviceRegistrationRequest.class); Assertions.assertNotNull(request.getCsr(), "CSR Should not have been null!"); } } diff --git a/jams-react-client/src/views/Blueprint/ServerUiCustomization.tsx b/jams-react-client/src/views/Blueprint/ServerUiCustomization.tsx index c72714181806214557b9e6d2d1e67a841883011a..21eb0e1b96185068393b2c1b36313a8b337c06ce 100644 --- a/jams-react-client/src/views/Blueprint/ServerUiCustomization.tsx +++ b/jams-react-client/src/views/Blueprint/ServerUiCustomization.tsx @@ -20,6 +20,7 @@ export interface ServerUiCustomization { */ mainBoxColor?: string; + /** the route for the logo, usually starts with "/api/image/filehandler/" */ logoUrl?: string; /** The logo size from 0 to 100. 100% if left undefined */ logoSize?: number; diff --git a/jams-react-client/src/views/UserProfile/DisplayUserProfile.tsx b/jams-react-client/src/views/UserProfile/DisplayUserProfile.tsx index 7a4b33e007d8195336d6128f2ef1a2928effbba3..0b219814cf1e123afb224a1840e1574cb1688b0d 100644 --- a/jams-react-client/src/views/UserProfile/DisplayUserProfile.tsx +++ b/jams-react-client/src/views/UserProfile/DisplayUserProfile.tsx @@ -310,9 +310,7 @@ export default function DisplayUserProfile(props) { if (auth.hasAdminScope()) { axios(configApiCall(api_path_get_admin_user, "GET", userData, null)) .then((response) => { - const result = JSON.parse( - response.data.replace(/\s+/g, " ").trim() - ); + const result = response.data; setRevoked(result.revoked); axios( configApiCall( diff --git a/jams-server/pom.xml b/jams-server/pom.xml index 3df97619e6f98e636c394d9c808c4e5252edf2ba..546b9697fa470f19138d228248b64b2e2012b3bc 100644 --- a/jams-server/pom.xml +++ b/jams-server/pom.xml @@ -89,11 +89,6 @@ <artifactId>json</artifactId> <version>20230618</version> </dependency> - <dependency> - <groupId>com.google.code.gson</groupId> - <artifactId>gson</artifactId> - <version>2.10.1</version> - </dependency> </dependencies> <build> 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 4a750d075bcc53ab1c5399f95870d09d5bd4169d..99d171b477a3b29b7e4e93cb4eae5a33991ba735 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 @@ -22,7 +22,7 @@ */ package net.jami.jams.server; -import com.jsoniter.JsonIterator; +import com.google.gson.Gson; import javassist.ClassPool; @@ -35,6 +35,7 @@ import net.jami.jams.common.authentication.local.LocalAuthSettings; 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.adapters.GsonFactory; import net.jami.jams.common.server.ServerSettings; import net.jami.jams.common.utils.LibraryLoader; import net.jami.jams.nameserver.LocalNameServer; @@ -48,8 +49,8 @@ import net.jami.jams.server.update.UpdateInterface; import java.awt.Desktop; import java.io.File; -import java.io.FileInputStream; -import java.io.InputStream; +import java.io.FileReader; +import java.io.Reader; import java.net.URI; import java.util.concurrent.atomic.AtomicBoolean; @@ -70,6 +71,7 @@ public class Server { public static LicenseService licenseService = new LicenseService(); public static final UpdateInterface updateInterface = new UpdateInterface(); public static JAMSUpdater appUpdater = new JAMSUpdater(new AtomicBoolean(false)); + private static final Gson gson = GsonFactory.createGson(); public static void main(String[] args) { // This is a fix to drop old cached stuff from the tomcat classloader. @@ -119,14 +121,13 @@ public class Server { ServerSettings serverSettings = null; if (isInstalled.get()) { try { - InputStream path = - new FileInputStream( + Reader reader = + new FileReader( new File( System.getProperty("user.dir") + File.separator + "config.json")); - serverSettings = - JsonIterator.deserialize(path.readAllBytes(), ServerSettings.class); + serverSettings = gson.fromJson(reader, ServerSettings.class); certificateAuthority = CryptoEngineLoader.loadCertificateAuthority( serverSettings.getCaConfiguration(), dataStore); @@ -142,7 +143,7 @@ public class Server { } if (serverSettings.getLocalDirectoryConfiguration() != null) { LocalAuthSettings settings = - JsonIterator.deserialize( + gson.fromJson( serverSettings.getLocalDirectoryConfiguration(), LocalAuthSettings.class); if (settings.getPublicNames()) diff --git a/jams-server/src/main/java/net/jami/jams/server/core/workflows/InstallationFinalizer.java b/jams-server/src/main/java/net/jami/jams/server/core/workflows/InstallationFinalizer.java index 62f66789e53904ce0ef311af82bfae8681ff55d5..bd7adecc5d5b5a52491eb440d2052ddf92f8a448 100644 --- a/jams-server/src/main/java/net/jami/jams/server/core/workflows/InstallationFinalizer.java +++ b/jams-server/src/main/java/net/jami/jams/server/core/workflows/InstallationFinalizer.java @@ -28,7 +28,7 @@ import static net.jami.jams.server.Server.nameServer; import static net.jami.jams.server.Server.tomcatLauncher; import static net.jami.jams.server.Server.userAuthenticationModule; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import lombok.extern.slf4j.Slf4j; @@ -36,6 +36,7 @@ import net.jami.jams.common.authentication.AuthenticationSourceType; import net.jami.jams.common.objects.roots.X509Fields; import net.jami.jams.common.objects.system.SystemAccount; import net.jami.jams.common.objects.system.SystemAccountType; +import net.jami.jams.common.serialization.adapters.GsonFactory; import net.jami.jams.common.server.ServerSettings; import net.jami.jams.nameserver.LocalNameServer; import net.jami.jams.nameserver.PublicNameServer; @@ -52,6 +53,7 @@ import java.security.KeyStore; public class InstallationFinalizer { private boolean useLocalNS = true; + private final Gson gson = GsonFactory.createGson(); public boolean finalizeInstallation() { // Basically here we build the config and flush it. @@ -59,24 +61,23 @@ public class InstallationFinalizer { log.info("Building configuration from submitted variables..."); ServerSettings serverSettings = new ServerSettings(); serverSettings.setCaConfiguration( - JsonStream.serialize(CachedObjects.certificateAuthorityConfig)); + gson.toJson(CachedObjects.certificateAuthorityConfig)); // TODO: This is a bit of hack, we should fix this someday. serverSettings.setServerPublicURI( CachedObjects.certificateAuthorityConfig.getServerDomain()); if (CachedObjects.activeDirectorySettings != null) { serverSettings.setActiveDirectoryConfiguration( - JsonStream.serialize(CachedObjects.activeDirectorySettings)); + gson.toJson(CachedObjects.activeDirectorySettings)); log.info( "Server configured to use Active Directory as the authentication backend!"); } if (CachedObjects.ldapSettings != null) { - serverSettings.setLdapConfiguration( - JsonStream.serialize(CachedObjects.ldapSettings)); + serverSettings.setLdapConfiguration(gson.toJson(CachedObjects.ldapSettings)); log.info("Server configured to use LDAP as the authentication backend!"); } if (CachedObjects.localAuthSettings != null) { serverSettings.setLocalDirectoryConfiguration( - JsonStream.serialize(CachedObjects.localAuthSettings)); + gson.toJson(CachedObjects.localAuthSettings)); if (CachedObjects.localAuthSettings.getPublicNames()) { useLocalNS = false; nameServer = @@ -90,7 +91,7 @@ public class InstallationFinalizer { } // Now flush the server settings. OutputStream os = new FileOutputStream(new File("config.json")); - os.write(JsonStream.serialize(serverSettings).getBytes()); + os.write(gson.toJson(serverSettings).getBytes()); os.flush(); os.close(); log.info("Settings succesfully saved to configuration file..."); diff --git a/jams-server/src/main/java/net/jami/jams/server/licensing/LicenseService.java b/jams-server/src/main/java/net/jami/jams/server/licensing/LicenseService.java index c5835d5ed87fd4c4b8f0ad0bb3dd8d94880701ac..0643c860159d567b1502c32e96d05b1fee280ae9 100644 --- a/jams-server/src/main/java/net/jami/jams/server/licensing/LicenseService.java +++ b/jams-server/src/main/java/net/jami/jams/server/licensing/LicenseService.java @@ -52,16 +52,13 @@ public class LicenseService { // Load the license. public void loadLicense() { try { + Path path = Path.of(System.getProperty("user.dir") + File.separator + "license.dat"); Vector<Object> v = - X509Utils.loadLicenseFromDatFile( - new String( - Files.readAllBytes( - Path.of( - System.getProperty("user.dir") - + File.separator - + "license.dat")))); + X509Utils.loadLicenseFromDatFile(new String(Files.readAllBytes(path))); + certificate = (X509Certificate) v.get(0); privateKey = (PrivateKey) v.get(1); + caCertificate = X509Utils.getCertificateFromPEMString( new String( @@ -69,6 +66,7 @@ public class LicenseService { .getClassLoader() .getResourceAsStream("oem/ca.crt") .readAllBytes())); + // Check the license for validity. try { certificate.checkValidity(); diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/LoginServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/LoginServlet.java index 1ba1ba3c9e7aab92b46fe6f5184b7576f1aaacb3..4fc103a252fa721afdec5953143f130bb28f82b3 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/LoginServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/LoginServlet.java @@ -27,8 +27,7 @@ import static net.jami.jams.server.Server.dataStore; import static net.jami.jams.server.servlets.api.auth.login.AuthRequestProcessor.processUsernamePasswordAuth; import static net.jami.jams.server.servlets.api.auth.login.AuthRequestProcessor.processX509Auth; -import com.jsoniter.JsonIterator; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; @@ -38,6 +37,7 @@ import jakarta.servlet.http.HttpServletResponse; import net.jami.jams.common.annotations.JsonContent; import net.jami.jams.common.authmodule.AuthTokenResponse; import net.jami.jams.common.objects.user.User; +import net.jami.jams.common.serialization.adapters.GsonFactory; import net.jami.jams.common.serialization.tomcat.TomcatCustomErrorHandler; import net.jami.jams.server.servlets.api.auth.login.LoginRequest; @@ -49,6 +49,7 @@ import java.util.Optional; // This method returns the token which is used for all the next calls to the // API. public class LoginServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); /** * @apiVersion 1.0.0 @@ -79,9 +80,7 @@ public class LoginServlet extends HttpServlet { req.getAttribute("jakarta.servlet.request.X509Certificate")); } else { // Case 3: form submitted username/password - LoginRequest object = - JsonIterator.deserialize( - req.getInputStream().readAllBytes(), LoginRequest.class); + LoginRequest object = gson.fromJson(req.getReader(), LoginRequest.class); if (object.getUsername() != null && object.getPassword() != null) { res = processUsernamePasswordAuth(object.getUsername(), object.getPassword()); Optional<User> user = dataStore.getUserDao().getByUsername(object.getUsername()); @@ -102,6 +101,6 @@ public class LoginServlet extends HttpServlet { resp.setContentType("application/json;charset=UTF-8"); if (res == null) TomcatCustomErrorHandler.sendCustomError(resp, 401, "Invalid credentials provided!"); - else resp.getOutputStream().write(JsonStream.serialize(res).getBytes()); + else resp.getOutputStream().write(gson.toJson(res).getBytes()); } } diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/contacts/ContactServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/contacts/ContactServlet.java index 6149f3873ff28e93b7de044cfb115ffe97d3bfbd..64117277f922060760af4c7663be3a91aadadb55 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/contacts/ContactServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/contacts/ContactServlet.java @@ -24,8 +24,7 @@ package net.jami.jams.server.servlets.api.admin.contacts; import static net.jami.jams.server.Server.dataStore; -import com.jsoniter.JsonIterator; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -37,6 +36,7 @@ import net.jami.jams.common.annotations.JsonContent; import net.jami.jams.common.annotations.ScopedServletMethod; import net.jami.jams.common.objects.contacts.Contact; import net.jami.jams.common.objects.user.AccessLevel; +import net.jami.jams.common.serialization.adapters.GsonFactory; import net.jami.jams.common.serialization.tomcat.TomcatCustomErrorHandler; import net.jami.jams.common.utils.ContactMerger; @@ -50,6 +50,7 @@ import java.util.Scanner; @WebServlet("/api/admin/contacts") public class ContactServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); /** * @apiVersion 1.0.0 @@ -69,7 +70,7 @@ public class ContactServlet extends HttpServlet { throws ServletException, IOException { List<Contact> contactList = dataStore.getContactDao().getByOwner(req.getParameter("username")); - resp.getOutputStream().write(JsonStream.serialize(contactList).getBytes()); + resp.getOutputStream().write(gson.toJson(contactList).getBytes()); } /** @@ -156,16 +157,13 @@ public class ContactServlet extends HttpServlet { throws ServletException, IOException { List<Contact> localList = dataStore.getContactDao().getByOwner(req.getParameter("username")); - List<Contact> remoteList = - Arrays.asList( - JsonIterator.deserialize( - req.getInputStream().readAllBytes(), Contact[].class)); + List<Contact> remoteList = Arrays.asList(gson.fromJson(req.getReader(), Contact[].class)); remoteList.forEach(contact -> contact.setOwner(req.getParameter("username"))); List<Contact> result = ContactMerger.mergeContacts(localList, remoteList); if (!dataStore.getContactDao().storeContactList(result)) TomcatCustomErrorHandler.sendCustomError(resp, 500, "Could not store contacts!"); - else resp.getOutputStream().write(JsonStream.serialize(result).getBytes()); + else resp.getOutputStream().write(gson.toJson(result).getBytes()); } } diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/devices/DeviceServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/devices/DeviceServlet.java index 656f3c2295a7992f6ac9738320636514784cf7e5..ea14c6abc6fd5aaa18d005c0eff631819e54584b 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/devices/DeviceServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/devices/DeviceServlet.java @@ -24,7 +24,7 @@ package net.jami.jams.server.servlets.api.admin.devices; import static net.jami.jams.server.Server.dataStore; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -36,12 +36,14 @@ import net.jami.jams.common.annotations.ScopedServletMethod; import net.jami.jams.common.objects.devices.Device; import net.jami.jams.common.objects.responses.DeviceRevocationResponse; import net.jami.jams.common.objects.user.AccessLevel; +import net.jami.jams.common.serialization.adapters.GsonFactory; import net.jami.jams.server.core.workflows.RevokeDeviceFlow; import java.io.IOException; @WebServlet("/api/admin/device") public class DeviceServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); // Get a detailed device info. @Override @@ -52,7 +54,7 @@ public class DeviceServlet extends HttpServlet { String deviceId = req.getParameter("deviceId"); Device device = dataStore.getDeviceDao().getByDeviceIdAndOwner(deviceId, username).orElseThrow(); - resp.getOutputStream().write(JsonStream.serialize(device).getBytes()); + resp.getOutputStream().write(gson.toJson(device).getBytes()); } // Update device data. @@ -77,8 +79,7 @@ public class DeviceServlet extends HttpServlet { String username = req.getParameter("username"); String deviceId = req.getParameter("deviceId"); DeviceRevocationResponse devResponse = RevokeDeviceFlow.revokeDevice(username, deviceId); - if (devResponse != null) - resp.getOutputStream().write(JsonStream.serialize(devResponse).getBytes()); + if (devResponse != null) resp.getOutputStream().write(gson.toJson(devResponse).getBytes()); else resp.sendError(500, "An exception has occurred while trying to revoke a device!"); } } diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/devices/DevicesServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/devices/DevicesServlet.java index a4b3de098e427d593196a1c9e55f67ece2b050b3..ffb5952b800ee32a1d8b79fc0c086444721d9961 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/devices/DevicesServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/devices/DevicesServlet.java @@ -25,7 +25,7 @@ package net.jami.jams.server.servlets.api.admin.devices; import static net.jami.jams.server.Server.certificateAuthority; import static net.jami.jams.server.Server.dataStore; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -37,12 +37,14 @@ import net.jami.jams.common.annotations.JsonContent; import net.jami.jams.common.annotations.ScopedServletMethod; import net.jami.jams.common.objects.devices.Device; import net.jami.jams.common.objects.user.AccessLevel; +import net.jami.jams.common.serialization.adapters.GsonFactory; import java.io.IOException; import java.util.List; @WebServlet("/api/admin/devices") public class DevicesServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); // Get a list of devices for a user. @Override @@ -65,6 +67,6 @@ public class DevicesServlet extends HttpServlet { }); } else devices.forEach(device -> device.setRevoked(false)); - resp.getOutputStream().write(JsonStream.serialize(devices).getBytes()); + resp.getOutputStream().write(gson.toJson(devices).getBytes()); } } diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/directory/DirectoryEntryServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/directory/DirectoryEntryServlet.java index faba679520c30fb998e5d799e27bee402611bc8f..4e2de211fca3e9a898771abe82eebd7f893409aa 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/directory/DirectoryEntryServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/directory/DirectoryEntryServlet.java @@ -26,8 +26,7 @@ package net.jami.jams.server.servlets.api.admin.directory; import static net.jami.jams.server.Server.dataStore; import static net.jami.jams.server.Server.userAuthenticationModule; -import com.jsoniter.JsonIterator; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -44,6 +43,7 @@ import net.jami.jams.common.authmodule.AuthModuleKey; import net.jami.jams.common.objects.user.AccessLevel; import net.jami.jams.common.objects.user.User; import net.jami.jams.common.objects.user.UserProfile; +import net.jami.jams.common.serialization.adapters.GsonFactory; import org.json.JSONObject; @@ -54,6 +54,7 @@ import java.util.Scanner; @Slf4j @WebServlet("/api/admin/directory/entry") public class DirectoryEntryServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); @Override @ScopedServletMethod(securityGroups = {AccessLevel.ADMIN}) @@ -85,7 +86,7 @@ public class DirectoryEntryServlet extends HttpServlet { resp.setStatus(200); HashMap<String, String> profileName = new HashMap<>(); profileName.put("username", userProfile.getUsername()); - resp.getOutputStream().write(JsonStream.serialize(profileName).getBytes()); + resp.getOutputStream().write(gson.toJson(profileName).getBytes()); } @Override @@ -93,8 +94,7 @@ public class DirectoryEntryServlet extends HttpServlet { throws IOException, SecurityException { // Update a user's profile. // Check if he is AD/LDAP - then return a 500, because we can't update those profile datas. - UserProfile userProfile = - JsonIterator.deserialize(req.getInputStream().readAllBytes(), UserProfile.class); + UserProfile userProfile = gson.fromJson(req.getReader(), UserProfile.class); String username = req.getAttribute("username").toString(); diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/GroupServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/GroupServlet.java index e6e0c6686a4039022403a9b5e96f4db9be45b85b..09f9203f5658f31e005ac2e791f79af8346d0ebb 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/GroupServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/GroupServlet.java @@ -2,7 +2,7 @@ package net.jami.jams.server.servlets.api.admin.group; import static net.jami.jams.server.Server.dataStore; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -16,6 +16,7 @@ import net.jami.jams.common.annotations.JsonContent; import net.jami.jams.common.annotations.ScopedServletMethod; import net.jami.jams.common.objects.user.AccessLevel; import net.jami.jams.common.objects.user.Group; +import net.jami.jams.common.serialization.adapters.GsonFactory; import org.json.JSONObject; @@ -26,6 +27,7 @@ import java.util.stream.Collectors; @WebServlet("/api/admin/group/*") @Slf4j public class GroupServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); @Override @ScopedServletMethod(securityGroups = {AccessLevel.ADMIN}) @@ -37,8 +39,7 @@ public class GroupServlet extends HttpServlet { Optional<Group> singleGroup = dataStore.getGroupDao().getById(id); if (singleGroup.isPresent()) { - resp.getOutputStream() - .write(JsonStream.serialize(singleGroup.orElseThrow()).getBytes()); + resp.getOutputStream().write(gson.toJson(singleGroup.orElseThrow()).getBytes()); resp.setStatus(200); } else { log.info("No group with this id was found!"); diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/GroupsServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/GroupsServlet.java index 38c7b761d1945d42cda581eb4007a026261d26ff..3ed4faa339532b6871105443eae1b37504c786df 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/GroupsServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/GroupsServlet.java @@ -2,7 +2,7 @@ package net.jami.jams.server.servlets.api.admin.group; import static net.jami.jams.server.Server.dataStore; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -16,6 +16,7 @@ import net.jami.jams.common.annotations.JsonContent; import net.jami.jams.common.annotations.ScopedServletMethod; import net.jami.jams.common.objects.user.AccessLevel; import net.jami.jams.common.objects.user.Group; +import net.jami.jams.common.serialization.adapters.GsonFactory; import java.io.IOException; import java.util.List; @@ -23,6 +24,7 @@ import java.util.List; @WebServlet("/api/admin/groups") @Slf4j public class GroupsServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); @Override @ScopedServletMethod(securityGroups = {AccessLevel.ADMIN}) @@ -33,7 +35,7 @@ public class GroupsServlet extends HttpServlet { List<Group> groups = dataStore.getGroupDao().getAll(); if (!groups.isEmpty()) { - resp.getOutputStream().write(JsonStream.serialize(groups).getBytes()); + resp.getOutputStream().write(gson.toJson(groups).getBytes()); resp.setStatus(200); } else { resp.setStatus(404); diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/PolicyProfileServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/PolicyProfileServlet.java index 06c5f0ceab1c077aefd7a4792b243745dd27165a..90e4c8aa764c477370ddb48a68ed03bd6669f588 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/PolicyProfileServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/PolicyProfileServlet.java @@ -2,7 +2,7 @@ package net.jami.jams.server.servlets.api.admin.group; import static net.jami.jams.server.Server.dataStore; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -16,6 +16,7 @@ import net.jami.jams.common.annotations.JsonContent; import net.jami.jams.common.annotations.ScopedServletMethod; import net.jami.jams.common.objects.user.AccessLevel; import net.jami.jams.common.objects.user.Policy; +import net.jami.jams.common.serialization.adapters.GsonFactory; import java.io.IOException; import java.util.List; @@ -24,6 +25,7 @@ import java.util.Optional; @WebServlet("/api/admin/policy/*") @Slf4j public class PolicyProfileServlet extends HttpServlet { + private static final Gson gson = GsonFactory.createGson(); @Override @ScopedServletMethod(securityGroups = {AccessLevel.ADMIN}) @@ -38,14 +40,14 @@ public class PolicyProfileServlet extends HttpServlet { throws IOException { if (name.equals("*")) { List<Policy> policies = dataStore.getPolicyDao().getAll(); - resp.getOutputStream().write(JsonStream.serialize(policies).getBytes()); + resp.getOutputStream().write(gson.toJson(policies).getBytes()); resp.setStatus(200); return; } Optional<Policy> policy = dataStore.getPolicyDao().getByName(name); if (policy.isPresent()) { - byte[] bytes = JsonStream.serialize(policy.orElseThrow()).getBytes(); + byte[] bytes = gson.toJson(policy.orElseThrow()).getBytes(); resp.getOutputStream().write(bytes); resp.setStatus(200); } else { diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/UserGroupServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/UserGroupServlet.java index ab32114b5eca71bb68a98e72c81b357fa0e0ca02..27b1b35911f0a5abbfc212489afc6e590380ccc5 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/UserGroupServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/group/UserGroupServlet.java @@ -2,7 +2,7 @@ package net.jami.jams.server.servlets.api.admin.group; import static net.jami.jams.server.Server.dataStore; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; @@ -15,6 +15,7 @@ import net.jami.jams.common.annotations.JsonContent; import net.jami.jams.common.annotations.ScopedServletMethod; import net.jami.jams.common.objects.user.AccessLevel; import net.jami.jams.common.objects.user.UserGroupMapping; +import net.jami.jams.common.serialization.adapters.GsonFactory; import org.json.JSONObject; @@ -26,6 +27,8 @@ import java.util.stream.Collectors; @WebServlet("/api/admin/group/members/*") @Slf4j public class UserGroupServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); + /** * @apiVersion 1.0.0 * @api {get} /api/admin/group/[groupId]/members/ Get JAMS groups members @@ -50,7 +53,7 @@ public class UserGroupServlet extends HttpServlet { if (result.isEmpty()) resp.sendError(404, "No users found for this group!"); else { - resp.getOutputStream().write(JsonStream.serialize(result).getBytes()); + resp.getOutputStream().write(gson.toJson(result).getBytes()); resp.setStatus(200); } } diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/update/SubscriptionServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/update/SubscriptionServlet.java index 098a95a0929a46da8f991c6ee2679d464d25981d..89ea65e13203ae292308f6e0dbb0b0d98aa164dc 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/update/SubscriptionServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/update/SubscriptionServlet.java @@ -22,7 +22,7 @@ */ package net.jami.jams.server.servlets.api.admin.update; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -34,6 +34,7 @@ import net.jami.jams.common.annotations.JsonContent; import net.jami.jams.common.annotations.ScopedServletMethod; import net.jami.jams.common.objects.responses.SubscriptionStatusResponse; import net.jami.jams.common.objects.user.AccessLevel; +import net.jami.jams.common.serialization.adapters.GsonFactory; import net.jami.jams.server.Server; import net.jami.jams.server.licensing.LicenseService; @@ -44,6 +45,7 @@ import java.io.IOException; @WebServlet("/api/admin/subscription") public class SubscriptionServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); // Get the subscription status (see: SubscriptionStatusResponse.class) @Override @@ -55,7 +57,7 @@ public class SubscriptionServlet extends HttpServlet { subscriptionStatusResponse.setLicenseInformation( Server.licenseService.getLicenseInformation()); subscriptionStatusResponse.setActivated(Server.activated.get()); - resp.getOutputStream().write(JsonStream.serialize(subscriptionStatusResponse).getBytes()); + resp.getOutputStream().write(gson.toJson(subscriptionStatusResponse).getBytes()); resp.getOutputStream().close(); } diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/update/UpdateServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/update/UpdateServlet.java index 915298bf550601453741616a21f473afce91925f..e8ca8309042e1851ecbde5950a53dd027a9bad69 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/update/UpdateServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/update/UpdateServlet.java @@ -24,7 +24,7 @@ package net.jami.jams.server.servlets.api.admin.update; import static net.jami.jams.server.Server.appUpdater; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -35,12 +35,14 @@ import jakarta.servlet.http.HttpServletResponse; import net.jami.jams.common.annotations.JsonContent; import net.jami.jams.common.annotations.ScopedServletMethod; import net.jami.jams.common.objects.user.AccessLevel; +import net.jami.jams.common.serialization.adapters.GsonFactory; import net.jami.jams.common.updater.FullSystemStatusResponse; import java.io.IOException; @WebServlet("/api/admin/update") public class UpdateServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); // Return the current version number and the available version number. @Override @@ -52,7 +54,7 @@ public class UpdateServlet extends HttpServlet { response.setLocalVersions(appUpdater.getLocalVersions()); response.setRemoteVersions(appUpdater.getRemoteVersions()); response.setUpdateAvailable(appUpdater.getUpdateAvailable()); - resp.getOutputStream().write(JsonStream.serialize(response).getBytes()); + resp.getOutputStream().write(gson.toJson(response).getBytes()); } // This is the do-update button. diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/users/UserGroupsServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/users/UserGroupsServlet.java index 796e78d560f5eb2f4c07c3e53121aa81a9f2d63b..1c0120320b27299047f802035e26ba97da7ea2cf 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/users/UserGroupsServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/users/UserGroupsServlet.java @@ -2,7 +2,7 @@ package net.jami.jams.server.servlets.api.admin.users; import static net.jami.jams.server.Server.dataStore; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; @@ -15,6 +15,7 @@ import net.jami.jams.common.annotations.JsonContent; import net.jami.jams.common.annotations.ScopedServletMethod; import net.jami.jams.common.objects.user.AccessLevel; import net.jami.jams.common.objects.user.UserGroupMapping; +import net.jami.jams.common.serialization.adapters.GsonFactory; import java.io.IOException; import java.util.List; @@ -22,6 +23,7 @@ import java.util.List; @WebServlet("/api/admin/user/groups/*") @Slf4j public class UserGroupsServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); /** * @apiVersion 1.0.0 @@ -47,7 +49,7 @@ public class UserGroupsServlet extends HttpServlet { if (result.isEmpty()) resp.sendError(404, "No groups found for this user!"); else { - resp.getOutputStream().write(JsonStream.serialize(result).getBytes()); + resp.getOutputStream().write(gson.toJson(result).getBytes()); resp.setStatus(200); } } diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/users/UserServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/users/UserServlet.java index 0e7ab354f88edb78224595565f7bc4ba7c979ac1..059756d34bfb9aa802cd4b9c42b23165edb4e673 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/users/UserServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/users/UserServlet.java @@ -27,7 +27,7 @@ import static net.jami.jams.server.Server.dataStore; import static net.jami.jams.server.Server.nameServer; import static net.jami.jams.server.Server.userAuthenticationModule; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -43,6 +43,7 @@ import net.jami.jams.common.objects.devices.Device; import net.jami.jams.common.objects.responses.DeviceRevocationResponse; import net.jami.jams.common.objects.user.AccessLevel; import net.jami.jams.common.objects.user.User; +import net.jami.jams.common.serialization.adapters.GsonFactory; import net.jami.jams.server.core.workflows.RevokeDeviceFlow; import net.jami.jams.server.core.workflows.RevokeUserFlow; @@ -52,7 +53,6 @@ import org.bouncycastle.cert.X509CRLHolder; import org.json.JSONObject; import java.io.IOException; -import java.util.HashMap; import java.util.List; import java.util.Optional; import java.util.concurrent.atomic.AtomicReference; @@ -60,6 +60,8 @@ import java.util.stream.Collectors; @WebServlet("/api/admin/user") public class UserServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); + // Get the user @Override @ScopedServletMethod(securityGroups = {AccessLevel.ADMIN}) @@ -90,7 +92,7 @@ public class UserServlet extends HttpServlet { } user.setPassword(""); user.setSalt(""); - resp.getOutputStream().write(JsonStream.serialize(user).getBytes()); + resp.getOutputStream().write(gson.toJson(user).getBytes()); resp.setStatus(200); } @@ -129,10 +131,7 @@ public class UserServlet extends HttpServlet { if (userAuthenticationModule.createUser( user.getUserType(), user.getRealm(), nameServer, user)) { - HashMap<String, String> statusInfo = new HashMap<>(); - statusInfo.put("password", hashedPassword); - resp.getOutputStream().write(JsonStream.serialize(statusInfo).getBytes()); - resp.setStatus(200); + resp.setStatus(201); return; } @@ -199,7 +198,7 @@ public class UserServlet extends HttpServlet { }); } if (devResponse.get() != null && devResponse.get().isSuccess()) { - resp.getOutputStream().write(JsonStream.serialize(devResponse).getBytes()); + resp.getOutputStream().write(gson.toJson(devResponse).getBytes()); } else resp.sendError(500, "An exception has occurred while trying to revoke a user!"); } } diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/users/UsersServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/users/UsersServlet.java index a2f593cb3a575c9977d56f10d48219aa652c44c8..e618dc3626cc7b3fff97507a220e64a8e348a378 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/users/UsersServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/users/UsersServlet.java @@ -24,7 +24,7 @@ package net.jami.jams.server.servlets.api.admin.users; import static net.jami.jams.server.Server.dataStore; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -34,11 +34,13 @@ import jakarta.servlet.http.HttpServletResponse; import net.jami.jams.common.annotations.ScopedServletMethod; import net.jami.jams.common.objects.user.AccessLevel; +import net.jami.jams.common.serialization.adapters.GsonFactory; import java.io.IOException; @WebServlet("/api/admin/users") public class UsersServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); // Returns a list of users. @Override @@ -46,6 +48,6 @@ public class UsersServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getOutputStream() - .write(JsonStream.serialize(dataStore.getUserDao().getAll().get(0)).getBytes()); + .write(gson.toJson(dataStore.getUserDao().getAll().get(0)).getBytes()); } } diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/contacts/ContactServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/contacts/ContactServlet.java index 1eb9d414f3cf744889f11f38b9e31ff4bc930496..738ef850b4e00580bdeb1c51847e03d34466a733 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/contacts/ContactServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/contacts/ContactServlet.java @@ -24,8 +24,7 @@ package net.jami.jams.server.servlets.api.auth.contacts; import static net.jami.jams.server.Server.dataStore; -import com.jsoniter.JsonIterator; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -34,6 +33,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import net.jami.jams.common.objects.contacts.Contact; +import net.jami.jams.common.serialization.adapters.GsonFactory; import net.jami.jams.common.serialization.tomcat.TomcatCustomErrorHandler; import net.jami.jams.common.utils.ContactMerger; @@ -46,6 +46,7 @@ import java.util.Scanner; @WebServlet("/api/auth/contacts") public class ContactServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); /** * @apiVersion 1.0.0 @@ -63,7 +64,7 @@ public class ContactServlet extends HttpServlet { throws ServletException, IOException { String username = req.getAttribute("username").toString(); List<Contact> contactList = dataStore.getContactDao().getByOwner(username); - resp.getOutputStream().write(JsonStream.serialize(contactList).getBytes()); + resp.getOutputStream().write(gson.toJson(contactList).getBytes()); } /** @@ -148,16 +149,13 @@ public class ContactServlet extends HttpServlet { throws ServletException, IOException { String owner = req.getAttribute("username").toString(); List<Contact> localList = dataStore.getContactDao().getByOwner(owner); - List<Contact> remoteList = - Arrays.asList( - JsonIterator.deserialize( - req.getInputStream().readAllBytes(), Contact[].class)); + List<Contact> remoteList = Arrays.asList(gson.fromJson(req.getReader(), Contact[].class)); remoteList.forEach(contact -> contact.setOwner(owner)); List<Contact> result = ContactMerger.mergeContacts(localList, remoteList); if (!dataStore.getContactDao().storeContactList(result)) TomcatCustomErrorHandler.sendCustomError(resp, 500, "Could not store contacts!"); - else resp.getOutputStream().write(JsonStream.serialize(result).getBytes()); + else resp.getOutputStream().write(gson.toJson(result).getBytes()); } } diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/device/DeviceServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/device/DeviceServlet.java index aa3031ec1569fba03b83a6eb8933493914e68f5d..fefaf5fac5f96454f24669695806e40467f6b411 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/device/DeviceServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/device/DeviceServlet.java @@ -27,8 +27,6 @@ import static net.jami.jams.server.Server.dataStore; import com.google.gson.Gson; import com.google.gson.JsonObject; -import com.jsoniter.JsonIterator; -import com.jsoniter.output.JsonStream; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -42,6 +40,7 @@ import net.jami.jams.common.objects.requests.DeviceRegistrationRequest; import net.jami.jams.common.objects.responses.DeviceRegistrationResponse; import net.jami.jams.common.objects.responses.DeviceRevocationResponse; import net.jami.jams.common.objects.user.AccessLevel; +import net.jami.jams.common.serialization.adapters.GsonFactory; import net.jami.jams.common.serialization.tomcat.TomcatCustomErrorHandler; import net.jami.jams.server.core.workflows.RegisterDeviceFlow; import net.jami.jams.server.core.workflows.RevokeDeviceFlow; @@ -50,6 +49,7 @@ import java.io.IOException; @WebServlet("/api/auth/device/*") public class DeviceServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); /** * @apiVersion 1.0.0 @@ -88,7 +88,7 @@ public class DeviceServlet extends HttpServlet { != null); else device.setRevoked(false); - resp.getOutputStream().write(JsonStream.serialize(device).getBytes()); + resp.getOutputStream().write(gson.toJson(device).getBytes()); } /** @@ -119,12 +119,11 @@ public class DeviceServlet extends HttpServlet { @Override @ScopedServletMethod(securityGroups = {AccessLevel.USER}) protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { - Gson gson = new Gson(); + Gson gson = GsonFactory.createGson(); String username = req.getAttribute("username").toString(); DeviceRegistrationRequest request = - JsonIterator.deserialize( - req.getInputStream().readAllBytes(), DeviceRegistrationRequest.class); + gson.fromJson(req.getReader(), DeviceRegistrationRequest.class); DeviceRegistrationResponse devResponse = RegisterDeviceFlow.registerDevice(username, request); @@ -241,8 +240,7 @@ public class DeviceServlet extends HttpServlet { } DeviceRevocationResponse devResponse = RevokeDeviceFlow.revokeDevice(owner, deviceId); - if (devResponse != null) - resp.getOutputStream().write(JsonStream.serialize(devResponse).getBytes()); + if (devResponse != null) resp.getOutputStream().write(gson.toJson(devResponse).getBytes()); else TomcatCustomErrorHandler.sendCustomError( resp, 500, "could not revoke device due to server-side error"); diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/device/DevicesServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/device/DevicesServlet.java index e8af8c4bd29ada6bc37d8d625e19e69cab528015..ef46da75528b370c14c3f8f3e18149a51f515fc5 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/device/DevicesServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/device/DevicesServlet.java @@ -25,7 +25,7 @@ package net.jami.jams.server.servlets.api.auth.device; import static net.jami.jams.server.Server.certificateAuthority; import static net.jami.jams.server.Server.dataStore; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -34,12 +34,14 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import net.jami.jams.common.objects.devices.Device; +import net.jami.jams.common.serialization.adapters.GsonFactory; import java.io.IOException; import java.util.List; @WebServlet("/api/auth/devices") public class DevicesServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); /** * @apiVersion 1.0.0 @@ -77,7 +79,7 @@ public class DevicesServlet extends HttpServlet { } else { devices.forEach(device -> device.setRevoked(false)); } - resp.getOutputStream().write(JsonStream.serialize(devices).getBytes()); + resp.getOutputStream().write(gson.toJson(devices).getBytes()); resp.setStatus(200); } } diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/DirectoriesServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/DirectoriesServlet.java index c4e8aadc6b3221848205752774f6b59b2c75a9b8..3584bbf44f9f380b6cd181dfc51bb04cd521018c 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/DirectoriesServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/DirectoriesServlet.java @@ -24,7 +24,7 @@ package net.jami.jams.server.servlets.api.auth.directory; import static net.jami.jams.server.Server.userAuthenticationModule; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -33,11 +33,13 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import net.jami.jams.common.annotations.JsonContent; +import net.jami.jams.common.serialization.adapters.GsonFactory; import java.io.IOException; @WebServlet("/api/auth/directories") public class DirectoriesServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); /** * @apiVersion 1.0.0 @@ -68,8 +70,6 @@ public class DirectoriesServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getOutputStream() - .write( - JsonStream.serialize(userAuthenticationModule.getAuthSources().keySet()) - .getBytes()); + .write(gson.toJson(userAuthenticationModule.getAuthSources().keySet()).getBytes()); } } diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/DirectoryEntryServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/DirectoryEntryServlet.java index 281f0d1c6045d7f52220ce2a58f5aea8e4c40086..042911244881451a214ef7e4b8a79d95ce7e2666 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/DirectoryEntryServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/DirectoryEntryServlet.java @@ -25,7 +25,7 @@ package net.jami.jams.server.servlets.api.auth.directory; import static net.jami.jams.server.Server.dataStore; import static net.jami.jams.server.Server.userAuthenticationModule; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -39,6 +39,7 @@ import net.jami.jams.common.authentication.AuthenticationSourceType; import net.jami.jams.common.authmodule.AuthModuleKey; import net.jami.jams.common.objects.user.User; import net.jami.jams.common.objects.user.UserProfile; +import net.jami.jams.common.serialization.adapters.GsonFactory; import java.io.IOException; import java.util.ArrayList; @@ -50,6 +51,7 @@ import java.util.Optional; @Slf4j @WebServlet("/api/auth/directory/entry") public class DirectoryEntryServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); /** * @apiVersion 1.0.0 @@ -217,8 +219,7 @@ public class DirectoryEntryServlet extends HttpServlet { }); if (req.getParameter("format") != null && req.getParameter("format").equals("vcard")) { resp.getOutputStream().write(userProfiles.get(0).getAsVCard().getBytes()); - } else - resp.getOutputStream().write(JsonStream.serialize(userProfiles.get(0)).getBytes()); + } else resp.getOutputStream().write(gson.toJson(userProfiles.get(0)).getBytes()); return; } if (req.getParameter("directory") != null && req.getParameter("directoryType") != null) { @@ -234,7 +235,7 @@ public class DirectoryEntryServlet extends HttpServlet { req.getParameter("username"), "LOGON_NAME", Optional.empty()); if (req.getParameter("format") != null && req.getParameter("format").equals("vcard")) { resp.getOutputStream().write(profiles.get(0).getAsVCard().getBytes()); - } else resp.getOutputStream().write(JsonStream.serialize(profiles.get(0)).getBytes()); + } else resp.getOutputStream().write(gson.toJson(profiles.get(0)).getBytes()); return; } List<UserProfile> userProfiles = new ArrayList<>(); @@ -250,7 +251,7 @@ public class DirectoryEntryServlet extends HttpServlet { }); if (req.getParameter("format") != null && req.getParameter("format").equals("vcard")) { resp.getOutputStream().write(userProfiles.get(0).getAsVCard().getBytes()); - } else resp.getOutputStream().write(JsonStream.serialize(userProfiles.get(0)).getBytes()); + } else resp.getOutputStream().write(gson.toJson(userProfiles.get(0)).getBytes()); } @Override diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/SearchDirectoryServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/SearchDirectoryServlet.java index ce82b41f233ef87b9977027841cd1d0f99145ce0..6c8885f2bb53dd497bd3ff31c7fba5c2ef086bd7 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/SearchDirectoryServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/SearchDirectoryServlet.java @@ -26,7 +26,7 @@ import static net.jami.jams.server.Server.dataStore; import static net.jami.jams.server.Server.nameServer; import static net.jami.jams.server.Server.userAuthenticationModule; -import com.jsoniter.JsonIterator; +import com.google.gson.Gson; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; @@ -45,6 +45,7 @@ import net.jami.jams.common.objects.user.Policy; import net.jami.jams.common.objects.user.PolicyData; import net.jami.jams.common.objects.user.User; import net.jami.jams.common.objects.user.UserProfile; +import net.jami.jams.common.serialization.adapters.GsonFactory; import org.json.JSONObject; @@ -60,6 +61,8 @@ import java.util.concurrent.ConcurrentHashMap; @Slf4j @WebServlet("/api/auth/directory/search") public class SearchDirectoryServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); + // The search directory function does not automatically create users, this would // be costly at this point // right now, we will implement it when Jami supports lists of users. this is a @@ -83,8 +86,7 @@ public class SearchDirectoryServlet extends HttpServlet { try { Policy policy = dataStore.getPolicyDao().getByUsername(username).orElseThrow(); - PolicyData policyData = - JsonIterator.deserialize(policy.getPolicyData(), PolicyData.class); + PolicyData policyData = gson.fromJson(policy.getPolicyData(), PolicyData.class); if (!policyData.getAllowLookup()) { resp.sendError(403, "Operation not allowed!"); diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/user/UserProfileServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/user/UserProfileServlet.java index 55e3b2a44955020b24fa9a6a63e15e4ea1483fce..c3ed6b3f56c005dea1bfbfd3a7d1ee9d231073a8 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/user/UserProfileServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/user/UserProfileServlet.java @@ -24,7 +24,7 @@ package net.jami.jams.server.servlets.api.auth.user; import static net.jami.jams.server.Server.userAuthenticationModule; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -34,12 +34,14 @@ import jakarta.servlet.http.HttpServletResponse; import net.jami.jams.common.annotations.JsonContent; import net.jami.jams.common.objects.user.UserProfile; +import net.jami.jams.common.serialization.adapters.GsonFactory; import java.io.IOException; @WebServlet("/api/auth/userprofile/*") @JsonContent public class UserProfileServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); // Get the user profile @Override @@ -58,7 +60,7 @@ public class UserProfileServlet extends HttpServlet { }); if (profile[0] != null) { - resp.getOutputStream().write(JsonStream.serialize(profile[0]).getBytes()); + resp.getOutputStream().write(gson.toJson(profile[0]).getBytes()); resp.setStatus(200); } else { resp.sendError(500, "User profile was not found!"); diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/user/UserServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/user/UserServlet.java index c0e76bba33d4b456b1379f078eaa7972a96cc87e..2d15fbb1d1c55a55d15c4c5c3f013b95472f46ec 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/user/UserServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/user/UserServlet.java @@ -25,7 +25,7 @@ package net.jami.jams.server.servlets.api.auth.user; import static net.jami.jams.server.Server.certificateAuthority; import static net.jami.jams.server.Server.dataStore; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -37,12 +37,14 @@ import net.jami.jams.common.annotations.ScopedServletMethod; import net.jami.jams.common.authentication.AuthenticationSourceType; import net.jami.jams.common.objects.user.AccessLevel; import net.jami.jams.common.objects.user.User; +import net.jami.jams.common.serialization.adapters.GsonFactory; import java.io.IOException; import java.util.Optional; @WebServlet("/api/auth/user") public class UserServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); // User can "read" himself. /** @@ -90,7 +92,7 @@ public class UserServlet extends HttpServlet { != null); } else user.setRevoked(false); resp.setStatus(200); - resp.getOutputStream().write(JsonStream.serialize(user).getBytes()); + resp.getOutputStream().write(gson.toJson(user).getBytes()); } // The user can update 3 fields: password,privatekey,publickey diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/CreateAuthSourceServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/CreateAuthSourceServlet.java index cf189835c45b00fdd7562ece0b31059c614e5067..dd0417949e22219a862f2923ed293e37c79236ed 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/CreateAuthSourceServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/CreateAuthSourceServlet.java @@ -24,8 +24,7 @@ package net.jami.jams.server.servlets.api.install; import static net.jami.jams.server.Server.userAuthenticationModule; -import com.jsoniter.JsonIterator; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -39,12 +38,14 @@ import net.jami.jams.common.annotations.ScopedServletMethod; import net.jami.jams.common.authentication.AuthenticationSourceType; import net.jami.jams.common.objects.requests.CreateAuthSourceRequest; import net.jami.jams.common.objects.user.AccessLevel; +import net.jami.jams.common.serialization.adapters.GsonFactory; import java.io.IOException; @WebServlet("/api/install/auth") @Slf4j public class CreateAuthSourceServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); @Override @ScopedServletMethod(securityGroups = {AccessLevel.ADMIN}) @@ -58,8 +59,7 @@ public class CreateAuthSourceServlet extends HttpServlet { protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { CreateAuthSourceRequest authSourceRequest = - JsonIterator.deserialize( - req.getInputStream().readAllBytes(), CreateAuthSourceRequest.class); + gson.fromJson(req.getReader(), CreateAuthSourceRequest.class); CachedObjects.localAuthSettings = null; CachedObjects.activeDirectorySettings = null; CachedObjects.ldapSettings = null; @@ -71,14 +71,14 @@ public class CreateAuthSourceServlet extends HttpServlet { case LDAP: if (userAuthenticationModule.testModuleConfiguration( AuthenticationSourceType.LDAP, - JsonStream.serialize(authSourceRequest.getLdapSettings()))) { + gson.toJson(authSourceRequest.getLdapSettings()))) { CachedObjects.ldapSettings = authSourceRequest.getLdapSettings(); } else error = true; break; case AD: if (userAuthenticationModule.testModuleConfiguration( AuthenticationSourceType.AD, - JsonStream.serialize(authSourceRequest.getActiveDirectorySettings()))) { + gson.toJson(authSourceRequest.getActiveDirectorySettings()))) { CachedObjects.activeDirectorySettings = authSourceRequest.getActiveDirectorySettings(); } else error = true; diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/CreateCAServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/CreateCAServlet.java index aab5313254594af58855a6b29dc692a004651910..560b8139a844c12ebab342aa55165cb4e9649b13 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/CreateCAServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/CreateCAServlet.java @@ -22,7 +22,7 @@ */ package net.jami.jams.server.servlets.api.install; -import com.jsoniter.JsonIterator; +import com.google.gson.Gson; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -33,12 +33,14 @@ import jakarta.servlet.http.HttpServletResponse; import net.jami.jams.common.annotations.ScopedServletMethod; import net.jami.jams.common.objects.requests.CreateCARequest; import net.jami.jams.common.objects.user.AccessLevel; +import net.jami.jams.common.serialization.adapters.GsonFactory; import net.jami.jams.common.utils.Validator; import java.io.IOException; @WebServlet("/api/install/ca") public class CreateCAServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); @Override @ScopedServletMethod(securityGroups = {AccessLevel.ADMIN}) @@ -51,9 +53,7 @@ public class CreateCAServlet extends HttpServlet { @ScopedServletMethod(securityGroups = {AccessLevel.ADMIN}) protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - CreateCARequest caRequest = - JsonIterator.deserialize( - req.getInputStream().readAllBytes(), CreateCARequest.class); + CreateCARequest caRequest = gson.fromJson(req.getReader(), CreateCARequest.class); if (!Validator.validateCARequests(caRequest)) { resp.sendError( 500, diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/CreateServerSettingsServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/CreateServerSettingsServlet.java index c11d2b917de293be73710dbb4bde658e2aa47f09..f56b97e2781595315d2a2503a0a4c4faa8ad0a87 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/CreateServerSettingsServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/CreateServerSettingsServlet.java @@ -22,7 +22,7 @@ */ package net.jami.jams.server.servlets.api.install; -import com.jsoniter.JsonIterator; +import com.google.gson.Gson; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -33,12 +33,14 @@ import jakarta.servlet.http.HttpServletResponse; import net.jami.jams.common.annotations.ScopedServletMethod; import net.jami.jams.common.cryptoengineapi.CertificateAuthorityConfig; import net.jami.jams.common.objects.user.AccessLevel; +import net.jami.jams.common.serialization.adapters.GsonFactory; import net.jami.jams.server.core.workflows.InstallationFinalizer; import java.io.IOException; @WebServlet("/api/install/settings") public class CreateServerSettingsServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); InstallationFinalizer finalizer = new InstallationFinalizer(); @@ -53,8 +55,7 @@ public class CreateServerSettingsServlet extends HttpServlet { @ScopedServletMethod(securityGroups = {AccessLevel.ADMIN}) protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { CertificateAuthorityConfig config = - JsonIterator.deserialize( - req.getInputStream().readAllBytes(), CertificateAuthorityConfig.class); + gson.fromJson(req.getReader(), CertificateAuthorityConfig.class); CachedObjects.certificateAuthorityConfig = config; if (!finalizer.finalizeInstallation()) { resp.sendError( diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/InstallLastStepServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/InstallLastStepServlet.java index 74fa00f7246bb8a22c973bb6449cb9d2240ebaf4..23689f2dedee8aa3c25874c817684e7d846cfe7c 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/InstallLastStepServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/InstallLastStepServlet.java @@ -22,7 +22,7 @@ */ package net.jami.jams.server.servlets.api.install; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; @@ -32,12 +32,14 @@ import jakarta.servlet.http.HttpServletResponse; import net.jami.jams.common.annotations.JsonContent; import net.jami.jams.common.annotations.ScopedServletMethod; import net.jami.jams.common.objects.user.AccessLevel; +import net.jami.jams.common.serialization.adapters.GsonFactory; import java.io.IOException; import java.util.HashMap; @WebServlet("/api/install/lastStep") public class InstallLastStepServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); @Override @ScopedServletMethod(securityGroups = {AccessLevel.ADMIN}) @@ -46,6 +48,6 @@ public class InstallLastStepServlet extends HttpServlet { HashMap<String, String> payload = new HashMap<>(); payload.put("uri", CachedObjects.endpoint); resp.setStatus(200); - resp.getOutputStream().write(JsonStream.serialize(payload).getBytes()); + resp.getOutputStream().write(gson.toJson(payload).getBytes()); } } diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/StartInstallServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/StartInstallServlet.java index 0240bb3b33f82a26281ee39ca41066240c3a005c..1013cd9ac1b7da23bf33940204ed32d62717a482 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/StartInstallServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/StartInstallServlet.java @@ -25,8 +25,7 @@ package net.jami.jams.server.servlets.api.install; import static net.jami.jams.server.Server.dataStore; import static net.jami.jams.server.servlets.api.auth.login.AuthRequestProcessor.processUsernamePasswordAuth; -import com.jsoniter.JsonIterator; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -43,6 +42,7 @@ import net.jami.jams.common.authmodule.AuthTokenResponse; import net.jami.jams.common.objects.requests.CredentialsRequest; import net.jami.jams.common.objects.user.AccessLevel; import net.jami.jams.common.objects.user.User; +import net.jami.jams.common.serialization.adapters.GsonFactory; import org.apache.commons.codec.binary.Base64; @@ -54,6 +54,7 @@ This is not scoped because it is called once. @Slf4j @WebServlet("/api/install/start") public class StartInstallServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); @Override @JsonContent @@ -72,8 +73,7 @@ public class StartInstallServlet extends HttpServlet { @JsonContent protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { CredentialsRequest credentialsRequest = - JsonIterator.deserialize( - req.getInputStream().readAllBytes(), CredentialsRequest.class); + gson.fromJson(req.getReader(), CredentialsRequest.class); AuthTokenResponse res = null; if (credentialsRequest.getUsername() != null && credentialsRequest.getPassword() != null) { res = @@ -82,7 +82,7 @@ public class StartInstallServlet extends HttpServlet { } resp.setHeader("endpoint", CachedObjects.endpoint); if (res == null) resp.sendError(403, "Could not authenticate!"); - else resp.getOutputStream().write(JsonStream.serialize(res).getBytes()); + else resp.getOutputStream().write(gson.toJson(res).getBytes()); } // This is the ONLY case where we write directly to the DB @@ -97,8 +97,7 @@ public class StartInstallServlet extends HttpServlet { return; } CredentialsRequest credentialsRequest = - JsonIterator.deserialize( - req.getInputStream().readAllBytes(), CredentialsRequest.class); + gson.fromJson(req.getReader(), CredentialsRequest.class); // The admin user has no X509 properties. byte[] salt = PasswordUtil.generateSalt(); String pw = PasswordUtil.hashPassword(credentialsRequest.getPassword(), salt); @@ -114,6 +113,6 @@ public class StartInstallServlet extends HttpServlet { AuthTokenResponse res = processUsernamePasswordAuth(user.getUsername(), credentialsRequest.getPassword()); CachedObjects.endpoint = "/api/install/ca"; - resp.getOutputStream().write(JsonStream.serialize(res).getBytes()); + resp.getOutputStream().write(gson.toJson(res).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 679e4e53663a0a32b668eaf8cbcbd7854d131c1d..4114756d386782acb06439fb62b2deca627cc154 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 @@ -24,7 +24,7 @@ package net.jami.jams.server.servlets.api.jaminameserver; import static net.jami.jams.server.Server.nameServer; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -33,12 +33,14 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import net.jami.jams.common.jami.NameLookupResponse; +import net.jami.jams.common.serialization.adapters.GsonFactory; import net.jami.jams.common.serialization.tomcat.TomcatCustomErrorHandler; import java.io.IOException; @WebServlet("/api/nameserver/name/*") public class NameServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); /** * @apiVersion 1.0.0 @@ -65,6 +67,6 @@ public class NameServlet extends HttpServlet { resp.setContentType("application/json;charset=UTF-8"); if (nameLookupResponse == null) TomcatCustomErrorHandler.sendCustomError(resp, 404, "name not found"); - else resp.getOutputStream().write(JsonStream.serialize(nameLookupResponse).getBytes()); + else resp.getOutputStream().write(gson.toJson(nameLookupResponse).getBytes()); } } diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/general/ServerStatusServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/general/ServerStatusServlet.java index ff78ca78cf446b84d7f5f14923a26bf2ef8b6cda..24c05dadf33e856ec054be630432698369985dee 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/general/ServerStatusServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/general/ServerStatusServlet.java @@ -22,7 +22,7 @@ */ package net.jami.jams.server.servlets.general; -import com.jsoniter.output.JsonStream; +import com.google.gson.Gson; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; @@ -30,6 +30,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import net.jami.jams.common.annotations.JsonContent; +import net.jami.jams.common.serialization.adapters.GsonFactory; import net.jami.jams.server.Server; import java.io.IOException; @@ -37,6 +38,7 @@ import java.util.HashMap; @WebServlet("/api/info") public class ServerStatusServlet extends HttpServlet { + private final Gson gson = GsonFactory.createGson(); @Override @JsonContent @@ -44,6 +46,6 @@ public class ServerStatusServlet extends HttpServlet { HashMap<String, String> statusInfo = new HashMap<>(); statusInfo.put("installed", String.valueOf(Server.isInstalled.get())); resp.setContentType("application/json;charset=UTF-8"); - resp.getOutputStream().write(JsonStream.serialize(statusInfo).getBytes()); + resp.getOutputStream().write(gson.toJson(statusInfo).getBytes()); } } diff --git a/jams-server/src/main/java/net/jami/jams/server/update/JAMSUpdater.java b/jams-server/src/main/java/net/jami/jams/server/update/JAMSUpdater.java index 83d00ed45ad61d0675a30bddc5a0f851220348cb..94a4bc34481813c8a28f2cea4390c808d3a346b8 100644 --- a/jams-server/src/main/java/net/jami/jams/server/update/JAMSUpdater.java +++ b/jams-server/src/main/java/net/jami/jams/server/update/JAMSUpdater.java @@ -22,19 +22,21 @@ */ package net.jami.jams.server.update; -import com.jsoniter.JsonIterator; -import com.jsoniter.any.Any; +import com.google.gson.Gson; +import com.google.gson.JsonObject; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import net.jami.jams.common.serialization.adapters.GsonFactory; import net.jami.jams.common.updater.AppUpdater; import net.jami.jams.common.updater.FileDescription; import net.jami.jams.server.Server; -import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; import java.security.PrivateKey; import java.security.cert.X509Certificate; import java.util.HashMap; @@ -58,18 +60,16 @@ public class JAMSUpdater implements AppUpdater { public static volatile X509Certificate certificate; public static volatile PrivateKey privateKey; + private final Gson gson = GsonFactory.createGson(); + public JAMSUpdater(AtomicBoolean doUpdate) { // read config json - try { - InputStream input = - this.getClass().getClassLoader().getResourceAsStream("oem/config.json"); - Any any = JsonIterator.deserialize(input.readAllBytes()); - UPDATE_SERVER_URI = any.get("UPDATE_URL").toString(); - UPDATE_INTERVAL = any.get("UPDATE_INTERVAL").toLong(); - } catch (IOException e) { - e.printStackTrace(); - } + InputStream input = this.getClass().getClassLoader().getResourceAsStream("oem/config.json"); + Reader reader = new InputStreamReader(input); + JsonObject jsonObject = gson.fromJson(reader, JsonObject.class); + UPDATE_SERVER_URI = jsonObject.get("UPDATE_URL").getAsString(); + UPDATE_INTERVAL = jsonObject.get("UPDATE_INTERVAL").getAsLong(); this.doUpdate = doUpdate; timer.schedule(updateCheckTask, 0, UPDATE_INTERVAL); diff --git a/jams-server/src/main/java/net/jami/jams/server/update/UpdateCheckTask.java b/jams-server/src/main/java/net/jami/jams/server/update/UpdateCheckTask.java index 72577dfcf98664a2b129e5700770c47ced621363..26139e58651f0e23538d5ba39d0224afd0d80148 100644 --- a/jams-server/src/main/java/net/jami/jams/server/update/UpdateCheckTask.java +++ b/jams-server/src/main/java/net/jami/jams/server/update/UpdateCheckTask.java @@ -22,13 +22,14 @@ */ package net.jami.jams.server.update; -import com.jsoniter.JsonIterator; -import com.jsoniter.any.Any; +import com.google.gson.Gson; +import com.google.gson.JsonObject; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import net.jami.jams.common.serialization.adapters.GsonFactory; import net.jami.jams.common.updater.FileDescription; import net.jami.jams.common.utils.VersioningUtils; import net.jami.jams.common.utils.X509Utils; @@ -40,6 +41,8 @@ import org.apache.http.impl.client.HttpClients; import org.apache.http.ssl.SSLContexts; import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; import java.security.KeyStore; import java.security.cert.X509Certificate; import java.util.HashMap; @@ -58,6 +61,8 @@ public class UpdateCheckTask extends TimerTask { private volatile KeyStore trustStore; protected static volatile String UPDATE_SERVER_URI; + private final Gson gson = GsonFactory.createGson(); + protected UpdateCheckTask() { try { InputStream is = @@ -78,8 +83,9 @@ public class UpdateCheckTask extends TimerTask { // read config json InputStream input = this.getClass().getClassLoader().getResourceAsStream("oem/config.json"); - Any any = JsonIterator.deserialize(input.readAllBytes()); - UPDATE_SERVER_URI = any.get("UPDATE_URL").toString(); + Reader reader = new InputStreamReader(input); + JsonObject jsonObject = gson.fromJson(reader, JsonObject.class); + UPDATE_SERVER_URI = jsonObject.get("UPDATE_URL").getAsString(); } catch (Exception e) { log.error("Could not initialize the trust store with error {}", e.getMessage()); } @@ -112,18 +118,23 @@ public class UpdateCheckTask extends TimerTask { HttpClient httpClient = HttpClients.custom().setSSLContext(sslContext).build(); HttpResponse response = httpClient.execute(new HttpGet(UPDATE_SERVER_URI + "/versions.json")); + // Step 2: Load the file into the hashmaps - Any any = JsonIterator.deserialize(response.getEntity().getContent().readAllBytes()); - any.asMap() + byte[] bytes = response.getEntity().getContent().readAllBytes(); + JsonObject jsonObject = gson.fromJson(new String(bytes), JsonObject.class); + + jsonObject + .entrySet() .forEach( - (k, v) -> - remoteData.put( - v.get("filename").toString(), - new FileDescription( - v.get("filename").toString(), - v.get("version").toString(), - v.get("md5").toString(), - k))); + (entry) -> { + String key = entry.getKey(); + JsonObject value = entry.getValue().getAsJsonObject(); + String version = value.get("version").getAsString(); + String filename = value.get("filename").getAsString(); + String md5 = value.get("md5").getAsString(); + remoteData.put( + key, new FileDescription(filename, version, md5, key)); + }); } catch (Exception e) { log.warn("Could not establish connection to JAMS Update Center with error: " + e); } diff --git a/jams-server/src/main/java/net/jami/jams/server/update/UpdateDownloader.java b/jams-server/src/main/java/net/jami/jams/server/update/UpdateDownloader.java index d3a212280648073244478a3571781761a2126390..2ef355fb83443b141ade07c60b2876bf504605f9 100644 --- a/jams-server/src/main/java/net/jami/jams/server/update/UpdateDownloader.java +++ b/jams-server/src/main/java/net/jami/jams/server/update/UpdateDownloader.java @@ -22,11 +22,12 @@ */ package net.jami.jams.server.update; -import com.jsoniter.JsonIterator; -import com.jsoniter.any.Any; +import com.google.gson.Gson; +import com.google.gson.JsonObject; import lombok.extern.slf4j.Slf4j; +import net.jami.jams.common.serialization.adapters.GsonFactory; import net.jami.jams.common.updater.FileDescription; import net.jami.jams.common.utils.X509Utils; import net.jami.jams.server.licensing.LicenseService; @@ -39,8 +40,9 @@ import org.apache.http.ssl.SSLContexts; import java.io.File; import java.io.FileOutputStream; -import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; import java.security.KeyStore; import java.security.cert.Certificate; import java.security.cert.X509Certificate; @@ -58,6 +60,8 @@ public class UpdateDownloader { private final HashMap<String, FileDescription> remoteChecksums = new HashMap<>(); + private final Gson gson = GsonFactory.createGson(); + public UpdateDownloader() { try { @@ -78,16 +82,15 @@ public class UpdateDownloader { e.getMessage()); } - try { - InputStream input = - this.getClass().getClassLoader().getResourceAsStream("oem/config.json"); - Any any = JsonIterator.deserialize(input.readAllBytes()); - UPDATE_SERVER_URL = any.get("UPDATE_URL").toString(); + InputStream input = this.getClass().getClassLoader().getResourceAsStream("oem/config.json"); - } catch (IOException e) { + if (input == null) { log.warn("Missing OEM configuration! Please contact software developer"); System.exit(-1); } + Reader reader = new InputStreamReader(input); + JsonObject jsonObject = gson.fromJson(reader, JsonObject.class); + UPDATE_SERVER_URL = jsonObject.get("UPDATE_URL").getAsString(); } public boolean downloadFiles(HashMap<String, FileDescription> files) { 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 index 35db9fcd20a6d0a94b7260652734edcf45665506..c165d8a5f3b835adb9126910879bf75151c9742f 100644 --- 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 @@ -29,6 +29,7 @@ import net.jami.jams.nameserver.PublicNameServer; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import java.util.UUID; @@ -42,6 +43,7 @@ class PublicNameServerTest { nameServer = new PublicNameServer("http://ns.jami.net"); } + @Disabled @Test public void testNameRegistration() { NameRegistrationRequest nameRegistrationRequest = new NameRegistrationRequest(); diff --git a/ldap-connector/src/main/java/net/jami/jams/ldap/connector/LDAPConnector.java b/ldap-connector/src/main/java/net/jami/jams/ldap/connector/LDAPConnector.java index ca4a2104a9a52ec00de2e7988d7660344c753071..e60d65c513eef4abead0ab9149dabfc78263917a 100644 --- a/ldap-connector/src/main/java/net/jami/jams/ldap/connector/LDAPConnector.java +++ b/ldap-connector/src/main/java/net/jami/jams/ldap/connector/LDAPConnector.java @@ -22,7 +22,7 @@ */ package net.jami.jams.ldap.connector; -import com.jsoniter.JsonIterator; +import com.google.gson.Gson; import lombok.extern.slf4j.Slf4j; @@ -32,7 +32,7 @@ import net.jami.jams.common.authentication.AuthenticationSourceType; import net.jami.jams.common.authentication.ldap.LDAPSettings; import net.jami.jams.common.objects.user.User; import net.jami.jams.common.objects.user.UserProfile; -import net.jami.jams.common.serialization.JsoniterRegistry; +import net.jami.jams.common.serialization.adapters.GsonFactory; import net.jami.jams.ldap.connector.service.AuthenticationService; import net.jami.jams.ldap.connector.service.UserProfileService; @@ -52,8 +52,8 @@ public class LDAPConnector implements AuthenticationSource { public static LDAPSettings settings; public LDAPConnector(String strSettings) { - JsoniterRegistry.initCodecs(); - LDAPConnector.settings = JsonIterator.deserialize(strSettings, LDAPSettings.class); + Gson gson = GsonFactory.createGson(); + LDAPConnector.settings = gson.fromJson(strSettings, LDAPSettings.class); BindConnectionInitializer bindConnectionInitializer = new BindConnectionInitializer(); bindConnectionInitializer.setBindDn(settings.getUsername()); bindConnectionInitializer.setBindCredential(new Credential(settings.getPassword())); diff --git a/pom.xml b/pom.xml index 8cf279354fe265de8b536e9c1711f501a97c4df3..40bf642289f88979475e1e92720abb0161873b74 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ <map.struct.version>1.3.0.Final</map.struct.version> <maven.surefire.version>2.22.1</maven.surefire.version> <junit.surefire.version>1.1.0</junit.surefire.version> - <jsoniter.version>0.9.23</jsoniter.version> + <gson.version>2.10.1</gson.version> <javassist.version>3.27.0-GA</javassist.version> <derby.version>10.14.2.0</derby.version> <msgpack.version>0.8.16</msgpack.version> @@ -78,9 +78,9 @@ <version>${log4j.version}</version> </dependency> <dependency> - <groupId>com.jsoniter</groupId> - <artifactId>jsoniter</artifactId> - <version>${jsoniter.version}</version> + <groupId>com.google.code.gson</groupId> + <artifactId>gson</artifactId> + <version>${gson.version}</version> </dependency> <dependency> <groupId>org.javassist</groupId>