Added option to disable attachments and groups on both client and server
This commit is contained in:
		@@ -1,6 +1,7 @@
 | 
			
		||||
package envoy.server.data;
 | 
			
		||||
 | 
			
		||||
import static envoy.data.Message.MessageStatus.*;
 | 
			
		||||
import static envoy.server.Startup.config;
 | 
			
		||||
 | 
			
		||||
import java.time.Instant;
 | 
			
		||||
 | 
			
		||||
@@ -104,7 +105,7 @@ public class Message {
 | 
			
		||||
		sender			= persistenceManager.getUserByID(message.getSenderID());
 | 
			
		||||
		recipient		= persistenceManager.getContactByID(message.getRecipientID());
 | 
			
		||||
		forwarded		= message.isForwarded();
 | 
			
		||||
		if (message.hasAttachment()) {
 | 
			
		||||
		if (config.isAttachmentSupportEnabled() && message.hasAttachment()) {
 | 
			
		||||
			final var messageAttachment = message.getAttachment();
 | 
			
		||||
			attachment		= messageAttachment.getData();
 | 
			
		||||
			attachmentName	= messageAttachment.getName();
 | 
			
		||||
 
 | 
			
		||||
@@ -33,6 +33,8 @@ public final class ServerConfig extends Config {
 | 
			
		||||
		put("featureLabel", "l-f", identity(), true);
 | 
			
		||||
		// enabling/ disabling several processors
 | 
			
		||||
		put("enableIssueReporting", "e-ir", Boolean::parseBoolean, true);
 | 
			
		||||
		put("enableGroups", "e-g", Boolean::parseBoolean, true);
 | 
			
		||||
		put("enableAttachments", "e-a", Boolean::parseBoolean, true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
@@ -47,6 +49,18 @@ public final class ServerConfig extends Config {
 | 
			
		||||
	 */
 | 
			
		||||
	public Boolean isIssueReportingEnabled() { return (Boolean) items.get("enableIssueReporting").get(); }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return {@code true} if attachment support has been enabled
 | 
			
		||||
	 * @since Envoy Client v0.3-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public Boolean isAttachmentSupportEnabled() { return (Boolean) items.get("enableAttachments").get(); }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return {@code true} if group support has been enabled
 | 
			
		||||
	 * @since Envoy Client v0.3-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public Boolean isGroupSupportEnabled() { return (Boolean) items.get("enableGroups").get(); }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return the URL where issues should be uploaded to
 | 
			
		||||
	 * @since Envoy Client v0.1-alpha
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,12 @@
 | 
			
		||||
package envoy.server.processors;
 | 
			
		||||
 | 
			
		||||
import static envoy.server.Startup.config;
 | 
			
		||||
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
 | 
			
		||||
import envoy.event.ElementOperation;
 | 
			
		||||
import envoy.event.GroupCreation;
 | 
			
		||||
import envoy.event.GroupCreationResult;
 | 
			
		||||
import envoy.event.contact.ContactOperation;
 | 
			
		||||
import envoy.server.data.Contact;
 | 
			
		||||
import envoy.server.data.PersistenceManager;
 | 
			
		||||
@@ -14,7 +17,7 @@ import envoy.server.net.ObjectWriteProxy;
 | 
			
		||||
 * Project: <strong>envoy-server-standalone</strong><br>
 | 
			
		||||
 * File: <strong>GroupCreationProcessor.java</strong><br>
 | 
			
		||||
 * Created: <strong>26.03.2020</strong><br>
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 * @author Maximilian Käfer
 | 
			
		||||
 * @since Envoy Server Standalone v0.1-beta
 | 
			
		||||
 */
 | 
			
		||||
@@ -25,7 +28,10 @@ public final class GroupCreationProcessor implements ObjectProcessor<GroupCreati
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void process(GroupCreation groupCreation, long socketID, ObjectWriteProxy writeProxy) {
 | 
			
		||||
		envoy.server.data.Group group = new envoy.server.data.Group();
 | 
			
		||||
		// Don't allow the creation of groups if manually disabled
 | 
			
		||||
		writeProxy.write(socketID, new GroupCreationResult(config.isGroupSupportEnabled()));
 | 
			
		||||
		if (!config.isGroupSupportEnabled()) return;
 | 
			
		||||
		final envoy.server.data.Group group = new envoy.server.data.Group();
 | 
			
		||||
		group.setName(groupCreation.get());
 | 
			
		||||
		group.setContacts(new HashSet<>());
 | 
			
		||||
		groupCreation.getInitialMemberIDs().stream().map(persistenceManager::getUserByID).forEach(group.getContacts()::add);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,64 +1,78 @@
 | 
			
		||||
package envoy.server.processors;
 | 
			
		||||
 | 
			
		||||
import static envoy.data.Message.MessageStatus.*;
 | 
			
		||||
 | 
			
		||||
import java.time.Instant;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
 | 
			
		||||
import javax.persistence.EntityExistsException;
 | 
			
		||||
 | 
			
		||||
import envoy.data.GroupMessage;
 | 
			
		||||
import envoy.event.MessageStatusChange;
 | 
			
		||||
import envoy.server.data.PersistenceManager;
 | 
			
		||||
import envoy.server.net.ConnectionManager;
 | 
			
		||||
import envoy.server.net.ObjectWriteProxy;
 | 
			
		||||
import envoy.util.EnvoyLog;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Project: <strong>envoy-server-standalone</strong><br>
 | 
			
		||||
 * File: <strong>GroupMessageProcessor.java</strong><br>
 | 
			
		||||
 * Created: <strong>18.04.2020</strong><br>
 | 
			
		||||
 * 
 | 
			
		||||
 * @author Maximilian Käfer
 | 
			
		||||
 * @since Envoy Server Standalone v0.1-beta
 | 
			
		||||
 */
 | 
			
		||||
public final class GroupMessageProcessor implements ObjectProcessor<GroupMessage> {
 | 
			
		||||
 | 
			
		||||
	private static final ConnectionManager	connectionManager	= ConnectionManager.getInstance();
 | 
			
		||||
	private static final PersistenceManager	persistenceManager	= PersistenceManager.getInstance();
 | 
			
		||||
	private static final Logger				logger				= EnvoyLog.getLogger(GroupCreationProcessor.class);
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void process(GroupMessage groupMessage, long socketID, ObjectWriteProxy writeProxy) {
 | 
			
		||||
		groupMessage.nextStatus();
 | 
			
		||||
 | 
			
		||||
		// Update statuses to SENT / RECEIVED depending on online status
 | 
			
		||||
		groupMessage.getMemberStatuses().replaceAll((memberID, status) -> connectionManager.isOnline(memberID) ? RECEIVED : SENT);
 | 
			
		||||
 | 
			
		||||
		// Set status for sender to READ
 | 
			
		||||
		groupMessage.getMemberStatuses().replace(groupMessage.getSenderID(), READ);
 | 
			
		||||
 | 
			
		||||
		// Increment the overall status to RECEIVED if necessary
 | 
			
		||||
		if (Collections.min(groupMessage.getMemberStatuses().values()) == RECEIVED) {
 | 
			
		||||
			groupMessage.nextStatus();
 | 
			
		||||
 | 
			
		||||
			// Notify the sender of the status change
 | 
			
		||||
			writeProxy.write(socketID, new MessageStatusChange(groupMessage));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Deliver the message to the recipients that are online
 | 
			
		||||
		writeProxy.writeToOnlineContacts(
 | 
			
		||||
				persistenceManager.getGroupByID(groupMessage.getRecipientID())
 | 
			
		||||
					.getContacts()
 | 
			
		||||
					.stream()
 | 
			
		||||
					.filter(c -> c.getID() != groupMessage.getSenderID()),
 | 
			
		||||
				groupMessage);
 | 
			
		||||
 | 
			
		||||
		try {
 | 
			
		||||
			PersistenceManager.getInstance().addMessage(new envoy.server.data.GroupMessage(groupMessage, Instant.now()));
 | 
			
		||||
		} catch (EntityExistsException e) {
 | 
			
		||||
			logger.warning("Received a groupMessage with an ID that already exists");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
package envoy.server.processors;
 | 
			
		||||
 | 
			
		||||
import static envoy.data.Message.MessageStatus.*;
 | 
			
		||||
import static envoy.server.Startup.config;
 | 
			
		||||
 | 
			
		||||
import java.time.Instant;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
 | 
			
		||||
import javax.persistence.EntityExistsException;
 | 
			
		||||
 | 
			
		||||
import envoy.data.GroupMessage;
 | 
			
		||||
import envoy.event.MessageStatusChange;
 | 
			
		||||
import envoy.event.NoAttachments;
 | 
			
		||||
import envoy.server.data.PersistenceManager;
 | 
			
		||||
import envoy.server.net.ConnectionManager;
 | 
			
		||||
import envoy.server.net.ObjectWriteProxy;
 | 
			
		||||
import envoy.util.EnvoyLog;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Project: <strong>envoy-server-standalone</strong><br>
 | 
			
		||||
 * File: <strong>GroupMessageProcessor.java</strong><br>
 | 
			
		||||
 * Created: <strong>18.04.2020</strong><br>
 | 
			
		||||
 *
 | 
			
		||||
 * @author Maximilian Käfer
 | 
			
		||||
 * @since Envoy Server Standalone v0.1-beta
 | 
			
		||||
 */
 | 
			
		||||
public final class GroupMessageProcessor implements ObjectProcessor<GroupMessage> {
 | 
			
		||||
 | 
			
		||||
	private static final ConnectionManager	connectionManager	= ConnectionManager.getInstance();
 | 
			
		||||
	private static final PersistenceManager	persistenceManager	= PersistenceManager.getInstance();
 | 
			
		||||
	private static final Logger				logger				= EnvoyLog.getLogger(GroupCreationProcessor.class);
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void process(GroupMessage groupMessage, long socketID, ObjectWriteProxy writeProxy) {
 | 
			
		||||
		groupMessage.nextStatus();
 | 
			
		||||
 | 
			
		||||
		// Update statuses to SENT / RECEIVED depending on online status
 | 
			
		||||
		groupMessage.getMemberStatuses().replaceAll((memberID, status) -> connectionManager.isOnline(memberID) ? RECEIVED : SENT);
 | 
			
		||||
 | 
			
		||||
		// Set status for sender to READ
 | 
			
		||||
		groupMessage.getMemberStatuses().replace(groupMessage.getSenderID(), READ);
 | 
			
		||||
 | 
			
		||||
		// Increment the overall status to RECEIVED if necessary
 | 
			
		||||
		if (Collections.min(groupMessage.getMemberStatuses().values()) == RECEIVED) {
 | 
			
		||||
			groupMessage.nextStatus();
 | 
			
		||||
 | 
			
		||||
			// Notify the sender of the status change
 | 
			
		||||
			writeProxy.write(socketID, new MessageStatusChange(groupMessage));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// message attachment will be automatically removed if disabled in config
 | 
			
		||||
		final var groupMessageServer = new envoy.server.data.GroupMessage(groupMessage, Instant.now());
 | 
			
		||||
		// Telling the server to reload the message without the attachment and telling
 | 
			
		||||
		// the client not to send anymore attachments
 | 
			
		||||
		if (!config.isAttachmentSupportEnabled() && groupMessage.hasAttachment()) {
 | 
			
		||||
			groupMessage = groupMessageServer.toCommon();
 | 
			
		||||
			writeProxy.write(socketID, new NoAttachments());
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// This is needed unfortunately because of f***ing lambda restrictions ("must be
 | 
			
		||||
		// fINaL oR EFfEcTivELy FiNAl")
 | 
			
		||||
		final var groupMessageCopy = groupMessage;
 | 
			
		||||
		// Deliver the message to the recipients that are online
 | 
			
		||||
		writeProxy.writeToOnlineContacts(
 | 
			
		||||
				persistenceManager.getGroupByID(groupMessageCopy.getRecipientID())
 | 
			
		||||
					.getContacts()
 | 
			
		||||
					.stream()
 | 
			
		||||
					.filter(c -> c.getID() != groupMessageCopy.getSenderID()),
 | 
			
		||||
				groupMessageCopy);
 | 
			
		||||
 | 
			
		||||
		try {
 | 
			
		||||
			PersistenceManager.getInstance().addMessage(groupMessageServer);
 | 
			
		||||
		} catch (final EntityExistsException e) {
 | 
			
		||||
			logger.warning("Received a groupMessage with an ID that already exists");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,7 @@
 | 
			
		||||
package envoy.server.processors;
 | 
			
		||||
 | 
			
		||||
import static envoy.server.Startup.config;
 | 
			
		||||
 | 
			
		||||
import java.util.logging.Level;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
 | 
			
		||||
@@ -7,6 +9,7 @@ import javax.persistence.EntityExistsException;
 | 
			
		||||
 | 
			
		||||
import envoy.data.Message;
 | 
			
		||||
import envoy.event.MessageStatusChange;
 | 
			
		||||
import envoy.event.NoAttachments;
 | 
			
		||||
import envoy.server.data.PersistenceManager;
 | 
			
		||||
import envoy.server.net.ConnectionManager;
 | 
			
		||||
import envoy.server.net.ObjectWriteProxy;
 | 
			
		||||
@@ -35,6 +38,11 @@ public final class MessageProcessor implements ObjectProcessor<Message> {
 | 
			
		||||
 | 
			
		||||
		// Convert to server message
 | 
			
		||||
		final var serverMessage = new envoy.server.data.Message(message);
 | 
			
		||||
		// Telling the server to reload the message without the attachment
 | 
			
		||||
		if (!config.isAttachmentSupportEnabled() && message.hasAttachment()) {
 | 
			
		||||
			message = serverMessage.toCommon();
 | 
			
		||||
			writeProxy.write(socketID, new NoAttachments());
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		try {
 | 
			
		||||
 | 
			
		||||
@@ -54,7 +62,7 @@ public final class MessageProcessor implements ObjectProcessor<Message> {
 | 
			
		||||
				// Note that the exact time stamp might differ slightly
 | 
			
		||||
				writeProxy.write(socketID, new MessageStatusChange(message));
 | 
			
		||||
			}
 | 
			
		||||
		} catch (EntityExistsException e) {
 | 
			
		||||
		} catch (final EntityExistsException e) {
 | 
			
		||||
			logger.log(Level.WARNING, "Received " + message + " with an ID that already exists!");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user