diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryMessageFactory.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryMessageFactory.java index 5f399ed0c46fd..b3a18d7072a00 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryMessageFactory.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryMessageFactory.java @@ -34,6 +34,14 @@ import org.apache.ignite.internal.codegen.TcpDiscoveryPingRequestSerializer; import org.apache.ignite.internal.codegen.TcpDiscoveryPingResponseSerializer; import org.apache.ignite.internal.codegen.TcpDiscoveryRingLatencyCheckMessageSerializer; +import org.apache.ignite.internal.codegen.UserAcceptedMessageSerializer; +import org.apache.ignite.internal.codegen.UserManagementOperationSerializer; +import org.apache.ignite.internal.codegen.UserProposedMessageSerializer; +import org.apache.ignite.internal.codegen.UserSerializer; +import org.apache.ignite.internal.processors.authentication.User; +import org.apache.ignite.internal.processors.authentication.UserAcceptedMessage; +import org.apache.ignite.internal.processors.authentication.UserManagementOperation; +import org.apache.ignite.internal.processors.authentication.UserProposedMessage; import org.apache.ignite.plugin.extensions.communication.MessageFactory; import org.apache.ignite.plugin.extensions.communication.MessageFactoryProvider; import org.apache.ignite.spi.discovery.tcp.messages.InetAddressMessage; @@ -58,10 +66,13 @@ public class DiscoveryMessageFactory implements MessageFactoryProvider { /** {@inheritDoc} */ @Override public void registerAll(MessageFactory factory) { + factory.register((short)-104, User::new, new UserSerializer()); + factory.register((short)-103, UserManagementOperation::new, new UserManagementOperationSerializer()); factory.register((short)-102, TcpDiscoveryNodeMetricsMessage::new, new TcpDiscoveryNodeMetricsMessageSerializer()); factory.register((short)-101, InetSocketAddressMessage::new, new InetSocketAddressMessageSerializer()); factory.register((short)-100, InetAddressMessage::new, new InetAddressMessageSerializer()); + // TcpDiscoveryAbstractMessage factory.register((short)0, TcpDiscoveryCheckFailedMessage::new, new TcpDiscoveryCheckFailedMessageSerializer()); factory.register((short)1, TcpDiscoveryPingRequest::new, new TcpDiscoveryPingRequestSerializer()); factory.register((short)2, TcpDiscoveryPingResponse::new, new TcpDiscoveryPingResponseSerializer()); @@ -76,5 +87,9 @@ public class DiscoveryMessageFactory implements MessageFactoryProvider { factory.register((short)11, TcpDiscoveryAuthFailedMessage::new, new TcpDiscoveryAuthFailedMessageSerializer()); factory.register((short)12, TcpDiscoveryDuplicateIdMessage::new, new TcpDiscoveryDuplicateIdMessageSerializer()); factory.register((short)13, TcpDiscoveryClientMetricsUpdateMessage::new, new TcpDiscoveryClientMetricsUpdateMessageSerializer()); + + // DiscoveryCustomMessage + factory.register((short)500, UserAcceptedMessage::new, new UserAcceptedMessageSerializer()); + factory.register((short)501, UserProposedMessage::new, new UserProposedMessageSerializer()); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/User.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/User.java index 1441bd9652176..97b332c9b593a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/User.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/User.java @@ -19,15 +19,17 @@ import java.io.Serializable; import java.util.Objects; +import org.apache.ignite.internal.Order; import org.apache.ignite.internal.util.tostring.GridToStringExclude; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.S; +import org.apache.ignite.plugin.extensions.communication.Message; import org.jetbrains.annotations.Nullable; import org.mindrot.BCrypt; /** */ -public class User implements Serializable { +public class User implements Serializable, Message { /** */ private static final long serialVersionUID = 0L; @@ -43,9 +45,11 @@ public class User implements Serializable { private static int bCryptGensaltLog2Rounds = 10; /** User name. */ + @Order(0) private String name; /** Hashed password. */ + @Order(value = 1, method = "hashedPassword") @GridToStringExclude private String hashedPasswd; @@ -71,6 +75,27 @@ public String name() { return name; } + /** + * @param name User name. + */ + public void name(String name) { + this.name = name; + } + + /** + * @return Hashed password. + */ + public String hashedPassword() { + return hashedPasswd; + } + + /** + * @param hashedPasswd Hashed password. + */ + public void hashedPassword(String hashedPasswd) { + this.hashedPasswd = hashedPasswd; + } + /** * Create new user. * @param name User name. @@ -141,12 +166,16 @@ public boolean authorize(String passwd) { /** {@inheritDoc} */ @Override public int hashCode() { - int result = Objects.hash(name, hashedPasswd); - return result; + return Objects.hash(name, hashedPasswd); } /** {@inheritDoc} */ @Override public String toString() { return S.toString(User.class, this); } + + /** {@inheritDoc} */ + @Override public short directType() { + return -104; + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserAcceptedMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserAcceptedMessage.java index ef87a444cb374..01357dd20d0a7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserAcceptedMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserAcceptedMessage.java @@ -17,7 +17,8 @@ package org.apache.ignite.internal.processors.authentication; -import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.internal.Order; +import org.apache.ignite.internal.managers.communication.ErrorMessage; import org.apache.ignite.internal.managers.discovery.DiscoCache; import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage; import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager; @@ -25,35 +26,48 @@ import org.apache.ignite.internal.util.tostring.GridToStringInclude; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.lang.IgniteUuid; +import org.apache.ignite.plugin.extensions.communication.Message; import org.jetbrains.annotations.Nullable; /** * Is sent as an acknowledgement for end (with success or error) of user management operation on the cluster * (see {@link UserProposedMessage} and {@link UserManagementOperation}). */ -public class UserAcceptedMessage implements DiscoveryCustomMessage { +public class UserAcceptedMessage implements DiscoveryCustomMessage, Message { /** */ private static final long serialVersionUID = 0L; /** */ - private final IgniteUuid id = IgniteUuid.randomUuid(); + @Order(0) + private IgniteUuid id; /** Operation ID. */ + @Order(value = 1, method = "operationId") @GridToStringInclude - private final IgniteUuid opId; + private IgniteUuid opId; - /** Error. */ - private final IgniteCheckedException error; + /** Error message. */ + @Order(value = 2, method = "errorMessage") + private ErrorMessage errMsg; + + /** Constructor. */ + public UserAcceptedMessage() { + // No-op. + } /** - * @param opId THe ID of operation. + * @param opId The ID of operation. * @param error Error. */ - UserAcceptedMessage(IgniteUuid opId, IgniteCheckedException error) { + UserAcceptedMessage(IgniteUuid opId, Throwable error) { assert opId != null || error != null; + id = IgniteUuid.randomUuid(); + this.opId = opId; - this.error = error; + + if (error != null) + errMsg = new ErrorMessage(error); } /** {@inheritDoc} */ @@ -61,6 +75,13 @@ public class UserAcceptedMessage implements DiscoveryCustomMessage { return id; } + /** + * @param id Unique custom message ID. + */ + public void id(IgniteUuid id) { + this.id = id; + } + /** {@inheritDoc} */ @Nullable @Override public DiscoveryCustomMessage ackMessage() { return null; @@ -80,19 +101,45 @@ public class UserAcceptedMessage implements DiscoveryCustomMessage { /** * @return User operation ID. */ - IgniteUuid operationId() { + public IgniteUuid operationId() { return opId; } + /** + * @param opId User operation ID. + */ + public void operationId(IgniteUuid opId) { + this.opId = opId; + } + + /** + * @return Error message. + */ + public ErrorMessage errorMessage() { + return errMsg; + } + + /** + * @param errMsg Error message. + */ + public void errorMessage(ErrorMessage errMsg) { + this.errMsg = errMsg; + } + /** * @return Error. */ - IgniteCheckedException error() { - return error; + Throwable error() { + return ErrorMessage.error(errMsg); } /** {@inheritDoc} */ @Override public String toString() { return S.toString(UserAcceptedMessage.class, this); } + + /** {@inheritDoc} */ + @Override public short directType() { + return 500; + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserManagementOperation.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserManagementOperation.java index 150a866cd8cfb..1cd20d8e9dd3b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserManagementOperation.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserManagementOperation.java @@ -19,24 +19,29 @@ import java.io.Serializable; import java.util.Objects; +import org.apache.ignite.internal.Order; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.lang.IgniteUuid; +import org.apache.ignite.plugin.extensions.communication.Message; /** * The operation with users. Used to deliver the information about requested operation to all server nodes. */ -public class UserManagementOperation implements Serializable { +public class UserManagementOperation implements Serializable, Message { /** */ private static final long serialVersionUID = 0L; /** User. */ + @Order(value = 0, method = "user") private User usr; /** Operation type. */ + @Order(1) private OperationType type; - /** Operation Id. */ - private final IgniteUuid id = IgniteUuid.randomUuid(); + /** Operation ID. */ + @Order(2) + private IgniteUuid id; /** * Constructor. @@ -52,6 +57,7 @@ public UserManagementOperation() { public UserManagementOperation(User usr, OperationType type) { this.usr = usr; this.type = type; + id = IgniteUuid.randomUuid(); } /** @@ -61,6 +67,13 @@ public User user() { return usr; } + /** + * @param usr User. + */ + public void user(User usr) { + this.usr = usr; + } + /** * @return Operation type. */ @@ -68,6 +81,13 @@ public OperationType type() { return type; } + /** + * @param type Operation type. + */ + public void type(OperationType type) { + this.type = type; + } + /** * @return Operation ID. */ @@ -75,6 +95,13 @@ public IgniteUuid id() { return id; } + /** + * @param id Operation ID. + */ + public void id(IgniteUuid id) { + this.id = id; + } + /** {@inheritDoc} */ @Override public String toString() { return S.toString(UserManagementOperation.class, this); @@ -98,6 +125,11 @@ public IgniteUuid id() { return id.hashCode(); } + /** {@inheritDoc} */ + @Override public short directType() { + return -103; + } + /** * User action type. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserProposedMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserProposedMessage.java index 1a0be8ecaa2c6..988fc1b602c12 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserProposedMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserProposedMessage.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.processors.authentication; +import org.apache.ignite.internal.Order; import org.apache.ignite.internal.managers.discovery.DiscoCache; import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage; import org.apache.ignite.internal.managers.discovery.DiscoveryServerOnlyCustomMessage; @@ -25,25 +26,33 @@ import org.apache.ignite.internal.util.tostring.GridToStringInclude; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.lang.IgniteUuid; +import org.apache.ignite.plugin.extensions.communication.Message; import org.jetbrains.annotations.Nullable; /** * A node sends this message when it wants to propose user operation (add / update / remove). - * + *

* After sending this message to the cluster sending node gets blocked until operation acknowledgement is received. - * + *

* {@link UserAcceptedMessage} is sent as an acknowledgement that operation is finished on the all nodes of the cluster. */ -public class UserProposedMessage implements DiscoveryServerOnlyCustomMessage { +public class UserProposedMessage implements DiscoveryServerOnlyCustomMessage, Message { /** */ private static final long serialVersionUID = 0L; /** */ - private final IgniteUuid id = IgniteUuid.randomUuid(); + @Order(0) + private IgniteUuid id; /** */ + @Order(value = 1, method = "operation") @GridToStringInclude - private final UserManagementOperation op; + private UserManagementOperation op; + + /** Constructor. */ + public UserProposedMessage() { + // No-op. + } /** * @param op User action. @@ -52,6 +61,7 @@ public class UserProposedMessage implements DiscoveryServerOnlyCustomMessage { assert op != null; this.op = op; + id = IgniteUuid.randomUuid(); } /** {@inheritDoc} */ @@ -59,6 +69,13 @@ public class UserProposedMessage implements DiscoveryServerOnlyCustomMessage { return id; } + /** + * @param id Unique custom message ID. + */ + public void id(IgniteUuid id) { + this.id = id; + } + /** * {@inheritDoc} */ @@ -80,12 +97,24 @@ public class UserProposedMessage implements DiscoveryServerOnlyCustomMessage { /** * @return User operation. */ - UserManagementOperation operation() { + public UserManagementOperation operation() { return op; } + /** + * @param op User operation. + */ + public void operation(UserManagementOperation op) { + this.op = op; + } + /** {@inheritDoc} */ @Override public String toString() { return S.toString(UserProposedMessage.class, this); } + + /** {@inheritDoc} */ + @Override public short directType() { + return 501; + } }