Skip to content

Commit 1f7cd8e

Browse files
committed
Add toggle to disable 1.19 chat signing, fix crash
1 parent 040341a commit 1f7cd8e

File tree

5 files changed

+34
-15
lines changed

5 files changed

+34
-15
lines changed

src/context/settingsContext.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,23 @@ export interface Settings {
1010
webLinks: boolean
1111
linkPrompt: boolean
1212
disableAutoCorrect: boolean
13+
enableChatSigning: boolean
1314
darkMode: boolean | null
1415
}
1516

1617
export const defaultSettings: Settings = {
17-
// TODO: Better defaults and settings.
18+
// TODO: Better defaults and settings. webLinks and linkPrompt are questionable.
1819
joinMessage:
1920
"I'm using EnderChat, a well-built, ad-free ChatCraft alternative! Even this message can be disabled!",
2021
sendJoinMessage: true,
2122
sendSpawnCommand: true,
2223
chatTheme: 'Colorless',
2324
fontSize: 16,
24-
webLinks: true,
2525
darkMode: null,
26+
webLinks: true,
2627
linkPrompt: true,
27-
disableAutoCorrect: false
28+
disableAutoCorrect: false,
29+
enableChatSigning: true
2830
}
2931

3032
export interface SettingsContext {

src/minecraft/chatToJsx.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ export interface PlainTextChat extends BaseChat {
6969

7070
export interface TranslatedChat {
7171
translate: string
72-
with: PlainTextChat[]
72+
with: string | PlainTextChat[]
7373
}
7474

7575
export type MinecraftChat = PlainTextChat | TranslatedChat | string
@@ -175,12 +175,16 @@ const parseChatToJsx = (
175175
componentProps?: {},
176176
trim = false
177177
) => {
178-
if (typeof chat !== 'string' && (chat as TranslatedChat).translate) {
178+
if (chat && typeof chat !== 'string' && (chat as TranslatedChat).translate) {
179179
const translatedChat = chat as TranslatedChat
180180
if (!translatedChat.with) translatedChat.with = []
181181
const translation = translations[translatedChat.translate]
182182
?.split('%s')
183-
?.map((text, index) => [{ text }, translatedChat.with[index]])
183+
?.map((text, index) => {
184+
let insert = translatedChat.with[index]
185+
if (typeof insert === 'string') insert = { text: insert }
186+
return [{ text }, insert]
187+
})
184188
?.flat()
185189
?.filter(component => !!component)
186190
chat = {

src/minecraft/connection.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -238,15 +238,18 @@ const initiateConnection = async (opts: ConnectionOptions) => {
238238
const encryptedVerifyToken = publicEncrypt(ePrms, verifyToken)
239239
// Send encryption response packet.
240240
// From this point forward, everything is encrypted, including the Login Success packet.
241-
const encryptionResponse = concatPacketData([
241+
const response: PacketDataTypes[] = [
242242
writeVarInt(encryptedSharedSecret.byteLength),
243243
encryptedSharedSecret,
244244
writeVarInt(encryptedVerifyToken.byteLength),
245245
encryptedVerifyToken
246-
])
246+
]
247+
if (opts.protocolVersion >= protocolMap[1.19]) {
248+
response.splice(2, 0, true)
249+
}
247250
const AES_ALG = 'aes-128-cfb8'
248251
conn.aesDecipher = createDecipheriv(AES_ALG, secret, secret)
249-
await conn.writePacket(0x01, encryptionResponse)
252+
await conn.writePacket(0x01, concatPacketData(response))
250253
conn.aesCipher = createCipheriv(AES_ALG, secret, secret)
251254
})().catch(e => {
252255
console.error(e)

src/screens/ServerScreen.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ import Dialog, { dialogStyles } from '../components/Dialog'
2424
import Text from '../components/Text'
2525
import TextField from '../components/TextField'
2626
import ElevatedView from '../components/ElevatedView'
27+
import useDarkMode from '../context/useDarkMode'
2728
import ServersContext from '../context/serversContext'
29+
import SettingsContext from '../context/settingsContext'
2830
import AccountsContext from '../context/accountsContext'
2931
import ConnectionContext from '../context/connectionContext'
3032
import { resolveHostname, protocolMap } from '../minecraft/utils'
@@ -43,7 +45,6 @@ import {
4345
mojangColorMap,
4446
parseValidJson
4547
} from '../minecraft/chatToJsx'
46-
import useDarkMode from '../context/useDarkMode'
4748
import config from '../../config.json'
4849

4950
const parseIp = (ipAddress: string): [string, number] => {
@@ -64,6 +65,7 @@ interface Session {
6465

6566
const ServerScreen = () => {
6667
const darkMode = useDarkMode()
68+
const { settings } = useContext(SettingsContext)
6769
const { servers, setServers } = useContext(ServersContext)
6870
const { accounts, setAccounts } = useContext(AccountsContext)
6971
const { connection, setConnection, setDisconnectReason } =
@@ -181,6 +183,7 @@ const ServerScreen = () => {
181183
if (protocolVersion === -1) {
182184
const ping = pingResponses[servers[server].address]
183185
// Try the latest.
186+
// TODO: Make 1.19 the default.
184187
if (!ping) protocolVersion = protocolMap['1.18.2']
185188
else if (typeof ping.version === 'object') {
186189
protocolVersion = ping.version.protocol
@@ -258,7 +261,9 @@ const ServerScreen = () => {
258261
protocolVersion,
259262
selectedProfile: uuid,
260263
accessToken: session?.accessToken,
261-
certificate: session?.certificate // TODO: Chat Signing toggle?
264+
certificate: settings.enableChatSigning
265+
? session?.certificate
266+
: undefined
262267
})
263268
const onCloseOrError = () => {
264269
setConnection(undefined)

src/screens/settings/SettingScreen.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ const SettingScreen = (props: { button?: JSX.Element }) => {
2222
</View>
2323
<ScrollView>
2424
{/* <Text>Hermes in use: {(global as any).HermesInternal ? 'true' : 'false'}</Text> */}
25+
<DarkModeSetting
26+
value={settings.darkMode}
27+
setValue={darkMode => setSettings({ darkMode })}
28+
/>
2529
<Setting
2630
multiline
2731
maxLength={256}
@@ -49,15 +53,16 @@ const SettingScreen = (props: { button?: JSX.Element }) => {
4953
value={settings.linkPrompt}
5054
setValue={linkPrompt => setSettings({ linkPrompt })}
5155
/>
56+
<Setting
57+
name='Enable 1.19 chat signing'
58+
value={settings.enableChatSigning}
59+
setValue={enableChatSigning => setSettings({ enableChatSigning })}
60+
/>
5261
<Setting
5362
name='Disable auto-correct in chat'
5463
value={settings.disableAutoCorrect}
5564
setValue={disableAutoCorrect => setSettings({ disableAutoCorrect })}
5665
/>
57-
<DarkModeSetting
58-
value={settings.darkMode}
59-
setValue={darkMode => setSettings({ darkMode })}
60-
/>
6166
{/* TODO: Text Font, Font Size, Chat Theme, Feedback/Support */}
6267
<Setting name='Version' value={version} />
6368
<Setting

0 commit comments

Comments
 (0)