|
1 | 1 | package fr.xephi.authme.service.bungeecord; |
2 | 2 |
|
| 3 | +import com.google.common.io.ByteArrayDataOutput; |
| 4 | +import com.google.common.io.ByteStreams; |
3 | 5 | import fr.xephi.authme.AuthMe; |
4 | 6 | import fr.xephi.authme.data.ProxySessionManager; |
5 | 7 | import fr.xephi.authme.process.Management; |
| 8 | +import fr.xephi.authme.security.HashUtils; |
6 | 9 | import fr.xephi.authme.service.BukkitService; |
7 | 10 | import fr.xephi.authme.settings.Settings; |
8 | 11 | import fr.xephi.authme.settings.properties.HooksSettings; |
9 | 12 | import org.bukkit.Server; |
| 13 | +import org.bukkit.entity.Player; |
10 | 14 | import org.bukkit.plugin.messaging.Messenger; |
11 | 15 | import org.junit.jupiter.api.BeforeEach; |
12 | 16 | import org.junit.jupiter.api.Test; |
|
19 | 23 | import static org.mockito.ArgumentMatchers.any; |
20 | 24 | import static org.mockito.ArgumentMatchers.eq; |
21 | 25 | import static org.mockito.BDDMockito.given; |
| 26 | +import static org.mockito.Mockito.mock; |
| 27 | +import static org.mockito.Mockito.never; |
22 | 28 | import static org.mockito.Mockito.verify; |
23 | 29 |
|
24 | 30 | @ExtendWith(MockitoExtension.class) |
@@ -77,4 +83,71 @@ void shouldUnregisterIncomingChannelWhenDisabledOnReload() { |
77 | 83 | verify(messenger).registerIncomingPluginChannel(plugin, "authme:main", bungeeReceiver); |
78 | 84 | verify(messenger).unregisterIncomingPluginChannel(plugin, "authme:main", bungeeReceiver); |
79 | 85 | } |
| 86 | + |
| 87 | + @Test |
| 88 | + void shouldQueueSessionAndForceLoginWhenPerformLoginReceivedForOnlinePlayer() { |
| 89 | + // given |
| 90 | + String sharedSecret = "test-secret"; |
| 91 | + String playerName = "Bobby"; |
| 92 | + long timestamp = System.currentTimeMillis(); |
| 93 | + String hmac = HashUtils.hmacSha256(sharedSecret, playerName + ":" + timestamp); |
| 94 | + |
| 95 | + given(settings.getProperty(HooksSettings.BUNGEECORD)).willReturn(true); |
| 96 | + given(settings.getProperty(HooksSettings.PROXY_SHARED_SECRET)).willReturn(sharedSecret); |
| 97 | + given(messenger.isIncomingChannelRegistered(plugin, "authme:main")).willReturn(false); |
| 98 | + |
| 99 | + Player player = mock(Player.class); |
| 100 | + given(player.isOnline()).willReturn(true); |
| 101 | + given(bukkitService.getPlayerExact(playerName)).willReturn(player); |
| 102 | + |
| 103 | + BungeeReceiver receiver = |
| 104 | + new BungeeReceiver(plugin, bukkitService, proxySessionManager, management, bungeeSender, settings); |
| 105 | + |
| 106 | + byte[] payload = buildPerformLoginPayload(playerName, timestamp, hmac); |
| 107 | + |
| 108 | + // when |
| 109 | + receiver.onPluginMessageReceived("authme:main", player, payload); |
| 110 | + |
| 111 | + // then |
| 112 | + verify(proxySessionManager).processProxySessionMessage(playerName); |
| 113 | + verify(management).forceLoginFromProxy(player); |
| 114 | + verify(bungeeSender).sendAuthMeBungeecordMessage(player, MessageType.PERFORM_LOGIN_ACK); |
| 115 | + } |
| 116 | + |
| 117 | + @Test |
| 118 | + void shouldOnlyQueueSessionWhenPerformLoginReceivedForOfflinePlayer() { |
| 119 | + // given |
| 120 | + String sharedSecret = "test-secret"; |
| 121 | + String playerName = "Bobby"; |
| 122 | + long timestamp = System.currentTimeMillis(); |
| 123 | + String hmac = HashUtils.hmacSha256(sharedSecret, playerName + ":" + timestamp); |
| 124 | + |
| 125 | + given(settings.getProperty(HooksSettings.BUNGEECORD)).willReturn(true); |
| 126 | + given(settings.getProperty(HooksSettings.PROXY_SHARED_SECRET)).willReturn(sharedSecret); |
| 127 | + given(messenger.isIncomingChannelRegistered(plugin, "authme:main")).willReturn(false); |
| 128 | + given(bukkitService.getPlayerExact(playerName)).willReturn(null); |
| 129 | + |
| 130 | + BungeeReceiver receiver = |
| 131 | + new BungeeReceiver(plugin, bukkitService, proxySessionManager, management, bungeeSender, settings); |
| 132 | + |
| 133 | + Player carrier = mock(Player.class); |
| 134 | + byte[] payload = buildPerformLoginPayload(playerName, timestamp, hmac); |
| 135 | + |
| 136 | + // when |
| 137 | + receiver.onPluginMessageReceived("authme:main", carrier, payload); |
| 138 | + |
| 139 | + // then |
| 140 | + verify(proxySessionManager).processProxySessionMessage(playerName); |
| 141 | + verify(management, never()).forceLoginFromProxy(any()); |
| 142 | + verify(bungeeSender, never()).sendAuthMeBungeecordMessage(any(), any()); |
| 143 | + } |
| 144 | + |
| 145 | + private static byte[] buildPerformLoginPayload(String playerName, long timestamp, String hmac) { |
| 146 | + ByteArrayDataOutput out = ByteStreams.newDataOutput(); |
| 147 | + out.writeUTF(MessageType.PERFORM_LOGIN.getId()); |
| 148 | + out.writeUTF(playerName); |
| 149 | + out.writeLong(timestamp); |
| 150 | + out.writeUTF(hmac); |
| 151 | + return out.toByteArray(); |
| 152 | + } |
80 | 153 | } |
0 commit comments