package com.faforever.client.patch; import com.faforever.client.patch.domain.UpdateServerRequest; import com.faforever.client.remote.io.QDataWriter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.serializer.Serializer; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.lang.invoke.MethodHandles; import java.nio.charset.StandardCharsets; import java.util.Arrays; public enum UpdateServerRequestSerializer implements Serializer<UpdateServerRequest> { INSTANCE; private static final String CONFIDENTIAL_INFORMATION_MASK = "********"; private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); @Override public void serialize(UpdateServerRequest object, OutputStream outputStream) throws IOException { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); QDataWriter qDataWriter = new QDataWriter(byteArrayOutputStream); qDataWriter.append(object.getUpdateServerCommand().name()); for (Object arg : object.getArgs()) { if (arg instanceof Double) { qDataWriter.writeInt32(((Double) arg).intValue()); } else if (arg instanceof Integer) { qDataWriter.writeInt32((int) arg); } else if (arg instanceof String) { qDataWriter.append((String) arg); } } qDataWriter.flush(); byte[] byteArray = byteArrayOutputStream.toByteArray(); if (logger.isDebugEnabled()) { // Remove the first 4 bytes which contain the length of the following data String data = new String(Arrays.copyOfRange(byteArray, 4, byteArray.length), StandardCharsets.UTF_16BE); for (String stringToMask : object.getStringsToMask()) { data = data.replace("\"" + stringToMask + "\"", "\"" + CONFIDENTIAL_INFORMATION_MASK + "\""); } logger.debug("Writing to server: {}", data); } outputStream.write(byteArray); } }