import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import java.util.*; import java.awt.image.BufferedImage; import java.math.BigInteger; /** * * Beschreibung * * * @version 1.1 vom 30.01.2020 * @author Thomas Schaller * Version 1.1: Hash-Funkion ausgetauscht, damit Hashes unterschiedlicher, Ö/P-Schlüssel in der gleichen Farbe */ import java.util.Timer; public class ManInTheMiddle extends ChatClient implements MySocketListener { // Anfang Attribute // Ende Attribute public ManInTheMiddle(String title) { // Frame-Initialisierung super(title); jTFName.setText("ManInTheMiddle"); jTFName.setEnabled(false); Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { updateTimes(); } }, 1000, 1000); } // end of public ManInTheMiddle // Anfang Methoden public void jBVerbinden_ActionPerformed(ActionEvent evt) { String a = jTFAdress.getText(); int p = jNFPort.getInt(); if (client != null && client.isAktiv()) { jTFAdress.setEnabled(true); jNFPort.setEnabled(true); jBVerbinden.setText("Verbinden"); client.trenneVerbindung(); } else { client = new MySocket(a, p, this); if (client.isAktiv()) { jTFAdress.setEnabled(false); jNFPort.setEnabled(false); jBVerbinden.setText("Trennen"); client.sendeNachricht("mitm:"); } } // end of if-else } // end of jBVerbinden_ActionPerformed public void jBSend_ActionPerformed(ActionEvent evt) { if (client != null && client.isAktiv()) { JMyButton button = (JMyButton) evt.getSource(); if (button.getEmpfaenger()!=null) { button.getNachricht().setEmpfaenger((String) button.getEmpfaenger().getSelectedItem()); } // end of if sendMessage(button.getNachricht()); this.updateNachrichtenListe(); } else { jTFAdress.setEnabled(true); jNFPort.setEnabled(true); jBVerbinden.setEnabled(true); } // end of if } // end of jBSend_ActionPerformed private void sendMessage(Nachricht n) { String b = "mess:"+n.getAbsender()+":"+n.getEmpfaenger()+":"+Base64.encode(n.getInhalt())+":"+Base64.encode(n.getHashCode()); n.setStopped(false); n.setSended(true); client.sendeNachricht(b); } public void nachrichtEmpfangen(MySocket client) { String s = client.holeNachricht(); String[] ss = s.split(":"); if (ss[0].equals("user")) { kontakte.add(ss[1]); Nachricht n = new Nachricht("Server","alle","Neuer User: "+ss[1]); n.setSended(true); nachrichten.add(0,n); this.updateNachrichtenListe(); } if(ss[0].equals("mess")) { String hash; if (ss.length==5) { hash = ss[4]; } else { hash = ""; }// end of if Nachricht n = new Nachricht(ss[1],ss[2],Base64.decode(ss[3]),Base64.decode(hash)); nachrichten.add(0,n); this.updateNachrichtenListe(); } // end of if String s = client.holeNachricht(); } protected void makeMessagePopup(MouseEvent evt, Nachricht n) { new MessagePopup2(evt, this, n, keys); } public void verbindungBeendet(MySocket client) { jTFAdress.setEnabled(true); jNFPort.setEnabled(true); jBVerbinden.setText("Verbinden"); client = null; } public void jBStopped_ActionPerformed(ActionEvent evt) { JMyButton button = (JMyButton) evt.getSource(); Nachricht n = button.getNachricht(); n.setStopped(true); } // end of jBSend_ActionPerformed public void updateTimes() { int i=0; Component[] c = jp.getComponents(); int cnr = 0; for (Nachricht n: nachrichten ) { if (n.getRestzeit()>0) { GridBagConstraints c2 = gbl.getConstraints(c[cnr]); while (cnr < c.length-1 && (c2.gridx != 4 || c2.gridy!=i+1)) { cnr++; c2 = gbl.getConstraints(c[cnr]); } // end of while JPanel p = (JPanel) (c[cnr]); if (p.getComponents()[1] instanceof JLabel) { JLabel l = (JLabel) (p.getComponents()[1]); l.setText(""+n.getRestzeit()+" sek"); } // end of if } else { if (!n.getSended() && !n.getStopped() && !n.getEmpfaenger().equals("")) { sendMessage(n); updateNachrichtenListe(); break; }// end of if-else// end of if } i++; } // end of for } public void updateNachrichtenListe() { GridBagConstraints c = new GridBagConstraints(); while (jp.getComponentCount()>1) { jp.remove(1); } // end of while //jp.removeAll(); if (jp.getComponentCount()==0) { JPanel eingabe = new JPanel(); eingabe.setBorder(BorderFactory.createBevelBorder(0)); eingabe.setLayout(null); eingabe.setBackground(new Color(250,255,200)); eingabe.setOpaque(true); eingabe.setPreferredSize(new Dimension(150,60)); c.gridx=0; c.gridy = 0; c.gridwidth=5; c.fill = GridBagConstraints.BOTH; c.weightx = 1.0; jTFNachricht.setBounds(100,20,800,20); JLabel nn = new JLabel(); nn.setText("Neue Nachricht"); nn.setBounds(2,20,90,20); eingabe.add(nn); eingabe.add(jTFNachricht); jp.add(eingabe,c); } c.weightx=0; c.gridwidth=1; int xx = 1; JLabel name = null; for (Nachricht n : nachrichten) { if (n.getKeys().size()>0 && name != null) { GridBagConstraints c2 = gbl.getConstraints(name); c2.gridheight++; gbl.setConstraints(name,c2); } else { name = new JLabel(); name.setText("Von "+n.getAbsender()+""); name.setBorder(BorderFactory.createBevelBorder(0)); name.setBackground(new Color(250,255,200)); name.setOpaque(true); c.gridx=0; c.gridy = xx; c.fill = GridBagConstraints.BOTH; jp.add(name,c); } // end of if-else JPanel nnn = new JPanel(); nnn.setLayout(new GridBagLayout()); nnn.setBorder(BorderFactory.createBevelBorder(0)); nnn.setBackground(new Color(250,255,200)); nnn.setOpaque(true); PicPanel pp = new PicPanel(n.getKeys()); pp.setPreferredSize(new Dimension(n.getKeys().size()*32,60)); pp.setBackground(new Color(250,255,200)); JMyLabel nachricht = new JMyLabel(n,""); if (n.getInhaltString().trim().length()>65) { nachricht.setText(""+n.getInhaltString().trim().substring(0,62)+"..."); } else { nachricht.setText(""+n.getInhaltString().trim()+""); } // end of if-else c.gridx=0; c.gridy = 0; c.weightx=1.0; c.weighty= 0; nnn.add(nachricht,c); c.gridx=1; c.gridy = 0; c.weightx=0.0; c.weighty= 0; nnn.add(pp,c); c.gridx=1; c.gridy = xx; c.weightx = 1.0; jp.add(nnn,c); nnn = new JPanel(); nnn.setLayout(new GridBagLayout()); nnn.setBorder(BorderFactory.createBevelBorder(0)); nnn.setBackground(new Color(250,255,200)); nnn.setOpaque(true); pp = new PicPanel(n.getHashKeys()); pp.setPreferredSize(new Dimension(n.getHashKeys().size()*32,60)); pp.setBackground(new Color(250,255,200)); String hc = new String(n.getHashCode()); if (hc.trim().length()>15) { hc = hc.substring(0,15)+"..."; } //end of if-else JMyLabel hash = new JMyLabel(n, hc); c.gridx=0; c.gridy = 0; c.weightx=1.0; c.weighty= 0; nnn.add(hash,c); c.gridx=1; c.gridy = 0; c.weightx=0.0; c.weighty= 0; nnn.add(pp,c); c.gridx=2; c.gridy = xx; c.weightx = 0.0; jp.add(nnn,c); JPanel abspanel = new JPanel(); abspanel.setPreferredSize(new Dimension(150,40)); abspanel.setBorder(BorderFactory.createBevelBorder(0)); abspanel.setBackground(new Color(250,255,200)); abspanel.setOpaque(true); abspanel.setLayout(new FlowLayout()); if (n.getEmpfaenger().equals("") && n.getSended()==false ) { String[] stringlist = new String[100]; JComboBox cb = new JComboBox(kontakte.toArray(stringlist)); abspanel.add(cb); ImageIcon water = new ImageIcon("arrow.png"); JMyButton button = new JMyButton(n, cb, water); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { jBSend_ActionPerformed(evt); } }); abspanel.add(button); } else { abspanel.add(new JLabel("an "+n.getEmpfaenger())); if (n.getStopped() && n.getSended()==false) { ImageIcon water = new ImageIcon("arrow.png"); JMyButton button = new JMyButton(n,null,water); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { jBSend_ActionPerformed(evt); } }); abspanel.add(button); } else { if (n.getRestzeit()>0) { abspanel.add(new JLabel(" "+n.getRestzeit()+" sek")); ImageIcon water = new ImageIcon("stop.png"); JMyButton button = new JMyButton(n,null,water); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { jBStopped_ActionPerformed(evt); } }); abspanel.add(button); } // end of if } } c.gridx=4; c.gridy = xx; c.weightx = 0.0; jp.add(abspanel,c); xx++; } JPanel dummy = new JPanel(); dummy.setBorder(BorderFactory.createBevelBorder(0)); dummy.setLayout(null); dummy.setBackground(new Color(250,255,200)); dummy.setOpaque(true); dummy.setPreferredSize(new Dimension(150,60)); c.gridx=0; c.gridy = xx; c.gridwidth=5; c.fill = GridBagConstraints.BOTH; c.weightx = 1.0; c.weighty = 1.0; jp.add(dummy,c); jp.revalidate(); jp.repaint(); } // Ende Methoden public static void main(String[] args) { new ManInTheMiddle("ManInTheMiddle"); } // end of main } // end of class ManInTheMiddle