import React, { Component } from 'react'; import { withTranslation } from "react-i18next"; import {Button, Badge, TextField, Grid, Container, Card, CardHeader, Paper, Avatar, Typography} from "@mui/material"; import ReconnectingWebSocket from 'reconnecting-websocket'; import { encryptMessage , decryptMessage} from "../utils/pgp"; import { getCookie } from "../utils/cookies"; import { saveAsTxt } from "../utils/saveFile"; class Chat extends Component { constructor(props) { super(props); } state = { own_pub_key: getCookie('pub_key').split('\\').join('\n'), own_enc_priv_key: getCookie('enc_priv_key').split('\\').join('\n'), peer_pub_key: null, token: getCookie('robot_token'), messages: [], value:'', connected: false, peer_connected: false, audit: false, }; rws = new ReconnectingWebSocket('ws://' + window.location.host + '/ws/chat/' + this.props.orderId + '/'); componentDidMount() { this.rws.addEventListener('open', () => { console.log('Connected!'); this.setState({connected: true}); if ( this.state.peer_pub_key == null){ this.rws.send(JSON.stringify({ type: "message", message: "----PLEASE SEND YOUR PUBKEY----", nick: this.props.ur_nick, })); } this.rws.send(JSON.stringify({ type: "message", message: this.state.own_pub_key, nick: this.props.ur_nick, })); }); this.rws.addEventListener('message', (message) => { const dataFromServer = JSON.parse(message.data); console.log('Got reply!', dataFromServer.type); if (dataFromServer){ console.log(dataFromServer) // If we receive our own key on a message if (dataFromServer.message == this.state.own_pub_key){console.log("ECHO OF OWN PUB KEY RECEIVED!!")} // If we receive a request to send our public key if (dataFromServer.message == `----PLEASE SEND YOUR PUBKEY----`) { this.rws.send(JSON.stringify({ type: "message", message: this.state.own_pub_key, nick: this.props.ur_nick, })); } else // If we receive a public key other than ours (our peer key!) if (dataFromServer.message.substring(0,36) == `-----BEGIN PGP PUBLIC KEY BLOCK-----` & dataFromServer.message != this.state.own_pub_key) { console.log("PEER KEY RECEIVED!!") this.setState({peer_pub_key:dataFromServer.message}) } else // If we receive an encrypted message if (dataFromServer.message.substring(0,27) == `-----BEGIN PGP MESSAGE-----`){ decryptMessage( dataFromServer.message.split('\\').join('\n'), dataFromServer.user_nick == this.props.ur_nick ? this.state.own_pub_key : this.state.peer_pub_key, this.state.own_enc_priv_key, this.state.token) .then((decryptedData) => this.setState((state) => ({ messages: [...state.messages, { encryptedMessage: dataFromServer.message.split('\\').join('\n'), plainTextMessage: decryptedData.decryptedMessage, validSignature: decryptedData.validSignature, userNick: dataFromServer.user_nick, time: dataFromServer.time }], }) )); } this.setState({peer_connected: dataFromServer.peer_connected}) } }); this.rws.addEventListener('close', () => { console.log('Socket is closed. Reconnect will be attempted'); this.setState({connected: false}); }); this.rws.addEventListener('error', () => { console.error('Socket encountered error: Closing socket'); }); // Encryption/Decryption Example // console.log(encryptMessage('Example text to encrypt!', // getCookie('pub_key').split('\\').join('\n'), // getCookie('enc_priv_key').split('\\').join('\n'), // getCookie('robot_token')) // .then((encryptedMessage)=> decryptMessage( // encryptedMessage, // getCookie('pub_key').split('\\').join('\n'), // getCookie('enc_priv_key').split('\\').join('\n'), // getCookie('robot_token')) // )) } componentDidUpdate() { this.scrollToBottom(); } scrollToBottom = () => { this.messagesEnd.scrollIntoView({ behavior: "smooth" }); } onButtonClicked = (e) => { if(this.state.value!=''){ encryptMessage(this.state.value, this.state.own_pub_key, this.state.peer_pub_key, this.state.own_enc_priv_key, this.state.token) .then((encryptedMessage) => console.log("Sending Encrypted MESSAGE "+encryptedMessage) & this.rws.send(JSON.stringify({ type: "message", message: encryptedMessage.split('\n').join('\\'), nick: this.props.ur_nick, }) ) & this.setState({value: ""}) ); } e.preventDefault(); } render() { const { t } = this.props; return ( {t("You")+": "}{this.state.connected ? t("connected"): t("disconnected")} {t("Peer")+": "}{this.state.peer_connected ? t("connected"): t("disconnected")} {this.state.messages.map((message, index) =>
  • {/* If message sender is not our nick, gray color, if it is our nick, green color */} {message.userNick == this.props.ur_nick ? } style={{backgroundColor: '#eeeeee'}} title={message.userNick} subheader={this.state.audit ? message.encryptedMessage : message.plainTextMessage} subheaderTypographyProps={{sx: {wordWrap: "break-word", width: '200px', color: '#444444'}}} /> : } style={{backgroundColor: '#fafafa'}} title={message.userNick} subheader={this.state.audit ? message.plaintTextEncrypted : message.plainTextMessage} subheaderTypographyProps={{sx: {wordWrap: "break-word", width: '200px', color: '#444444'}}} />}
  • )}
    { this.messagesEnd = el; }}>
    { this.setState({ value: e.target.value }); this.value = this.state.value; }} sx={{width: 214}} />
    ) } } export default withTranslation()(Chat);