SignedMessageValidator.java

net.minecraft.network.chat.SignedMessageValidator

信息

  • 全限定名:net.minecraft.network.chat.SignedMessageValidator
  • 类型:public interface
  • 包:net.minecraft.network.chat
  • 源码路径:src/main/java/net/minecraft/network/chat/SignedMessageValidator.java
  • 起始行号:L10
  • 职责:

    TODO

字段/常量

  • LOGGER

    • 类型: Logger
    • 修饰符: package-private
    • 源码定位: L11
    • 说明:

      TODO

  • ACCEPT_UNSIGNED

    • 类型: SignedMessageValidator
    • 修饰符: package-private
    • 源码定位: L12
    • 说明:

      TODO

  • REJECT_ALL

    • 类型: SignedMessageValidator
    • 修饰符: package-private
    • 源码定位: L13
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.network.chat.SignedMessageValidator.KeyBased
    • 类型: class
    • 修饰符: public static
    • 源码定位: L20
    • 说明:

      TODO

构造器

方法

下面的方法块按源码顺序生成。

PlayerChatMessage updateAndValidate(PlayerChatMessage message) @ L18

  • 方法名:updateAndValidate
  • 源码定位:L18
  • 返回类型:PlayerChatMessage
  • 修饰符:package-private

参数:

  • message: PlayerChatMessage

说明:

TODO

代码

@FunctionalInterface
public interface SignedMessageValidator {
    Logger LOGGER = LogUtils.getLogger();
    SignedMessageValidator ACCEPT_UNSIGNED = PlayerChatMessage::removeSignature;
    SignedMessageValidator REJECT_ALL = message -> {
        LOGGER.error("Received chat message from {}, but they have no chat session initialized and secure chat is enforced", message.sender());
        return null;
    };
 
    @Nullable PlayerChatMessage updateAndValidate(PlayerChatMessage message);
 
    public static class KeyBased implements SignedMessageValidator {
        private final SignatureValidator validator;
        private final BooleanSupplier expired;
        private @Nullable PlayerChatMessage lastMessage;
        private boolean isChainValid = true;
 
        public KeyBased(SignatureValidator validator, BooleanSupplier expired) {
            this.validator = validator;
            this.expired = expired;
        }
 
        private boolean validateChain(PlayerChatMessage message) {
            if (message.equals(this.lastMessage)) {
                return true;
            } else if (this.lastMessage != null && !message.link().isDescendantOf(this.lastMessage.link())) {
                LOGGER.error(
                    "Received out-of-order chat message from {}: expected index > {} for session {}, but was {} for session {}",
                    message.sender(),
                    this.lastMessage.link().index(),
                    this.lastMessage.link().sessionId(),
                    message.link().index(),
                    message.link().sessionId()
                );
                return false;
            } else {
                return true;
            }
        }
 
        private boolean validate(PlayerChatMessage message) {
            if (this.expired.getAsBoolean()) {
                LOGGER.error("Received message with expired profile public key from {} with session {}", message.sender(), message.link().sessionId());
                return false;
            } else if (!message.verify(this.validator)) {
                LOGGER.error(
                    "Received message with invalid signature (is the session wrong, or signature cache out of sync?): {}",
                    PlayerChatMessage.describeSigned(message)
                );
                return false;
            } else {
                return this.validateChain(message);
            }
        }
 
        @Override
        public @Nullable PlayerChatMessage updateAndValidate(PlayerChatMessage message) {
            this.isChainValid = this.isChainValid && this.validate(message);
            if (!this.isChainValid) {
                return null;
            } else {
                this.lastMessage = message;
                return message;
            }
        }
    }
}

引用的其他类

  • PlayerChatMessage
    • 引用位置: 参数/方法调用/返回值
    • 关联成员: PlayerChatMessage.describeSigned()