From fe21ccf4003d2f6df94c5b89e09aabb4c600b0de Mon Sep 17 00:00:00 2001 From: ChaosLL1337 Date: Sun, 18 Oct 2026 14:01:02 +0200 Subject: [PATCH] Bau bau --- .idea/.gitignore | 10 +++++ .idea/VS-Aufgabe-1.iml | 9 ++++ .idea/compiler.xml | 13 ++++++ .idea/encodings.xml | 7 ++++ .idea/jarRepositories.xml | 20 +++++++++ .idea/misc.xml | 15 +++++++ .idea/modules.xml | 8 ++++ .idea/vcs.xml | 6 +++ vs.pu01/src/main/java/vs/Main.java | 66 +++++++++++++++++++----------- 9 files changed, 129 insertions(+), 25 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/VS-Aufgabe-1.iml create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..30cf57e --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/VS-Aufgabe-1.iml b/.idea/VS-Aufgabe-1.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/VS-Aufgabe-1.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b9e1a22 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..928a6c8 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..712ab9d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..ae5968e --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..ab397ae --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/vs.pu01/src/main/java/vs/Main.java b/vs.pu01/src/main/java/vs/Main.java index ae40d65..b8bea13 100644 --- a/vs.pu01/src/main/java/vs/Main.java +++ b/vs.pu01/src/main/java/vs/Main.java @@ -1,19 +1,21 @@ package vs; -import com.sun.jdi.InternalException; - import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; import java.net.SocketTimeoutException; import java.nio.charset.StandardCharsets; +import java.util.Arrays; public class Main { static DatagramSocket syslogSocket; static DatagramSocket broadcastSocket; + static final int MAX_LEN = 2048; // max. erlaubte Nachrichtenlänge in Byte + static final int RECV_BUF = 65535; // Puffer größer als jede UDP-Nachricht, damit zu lange Nachrichten erkannt werden + public static void main(String[] args){ @@ -40,7 +42,7 @@ public class Main { } while (true){ - byte[] buffer = new byte[2048]; + byte[] buffer = new byte[RECV_BUF]; DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length); @@ -70,21 +72,27 @@ public class Main { throw new RuntimeException(e); } + if (packet.getLength() > MAX_LEN){ + System.out.println("[verworfen] msg too long ("+packet.getLength()+" bytes > "+MAX_LEN+") from "+packet.getAddress().getHostAddress()+":"+packet.getPort()+", dropped"); + continue; + } + try { - SyslogMessage msg = parseSysMessage(packet.getData()); - System.out.println("Log received from "+packet.getAddress().getHostName() +":"+ packet.getPort()+ " : "+msg.toString()); + SyslogMessage msg = parseSysMessage(Arrays.copyOf(packet.getData(),packet.getLength())); + System.out.println("Log received from "+packet.getAddress().getHostAddress() +":"+ packet.getPort()+ " : "+msg.toString()); + }catch (ArrayIndexOutOfBoundsException e){ + System.out.println("[verworfen] msg truncated or malformed from "+packet.getAddress().getHostAddress()+":"+packet.getPort()); }catch (Exception e){ - System.err.println("msg couldnt be parsed, "+e.getMessage()); - e.printStackTrace(); + System.out.println("[verworfen] msg not valid from "+packet.getAddress().getHostAddress()+":"+packet.getPort()+": "+e.getMessage()); } } } - static SyslogMessage parseSysMessage(byte[] buff) throws InternalException{ - if (buff[0] != 60){ - throw new InternalException("msg not well formed"); + static SyslogMessage parseSysMessage(byte[] buff){ + if (buff.length == 0 || buff[0] != 60){ + throw new IllegalArgumentException("msg not well formed"); } SyslogMessage.Facility fac; SyslogMessage.Severity sev; @@ -96,15 +104,16 @@ public class Main { if (buff[step] == 62) break; prival_str += (char) buff[step]; } - if (buff[step] != 62) throw new InternalException("PRIVAL malformed"); - if (prival_str.isEmpty()) throw new InternalException("PRIVAL not there"); + if (buff[step] != 62) throw new IllegalArgumentException("PRIVAL malformed"); + if (prival_str.isEmpty()) throw new IllegalArgumentException("PRIVAL not there"); int primval = Integer.parseInt(prival_str); + if (primval > 191) throw new IllegalArgumentException("PRIVAL out of range"); fac = SyslogMessage.Facility.values()[primval/8]; sev = SyslogMessage.Severity.values()[primval%8]; //version is always 1 - if (buff[++step] != 49) throw new InternalException("VERSION NOT 1"); + if (buff[++step] != 49) throw new IllegalArgumentException("VERSION NOT 1"); //skip whitespace and verion ++step; @@ -168,26 +177,33 @@ public class Main { //skip structured data - while (buff[step] != 32){ + while (step < buff.length && buff[step] != 32){ step++; } //MESSAGE - String end = new String(buff,step,buff.length-step-1); - SyslogMessage.Message msg; + SyslogMessage.Message msg = null; //MSG is optional + int start = step + 1; //step points to the whitespace before MSG - if (end.startsWith("\u00EF\u00BB\u00BF")){ - msg = new SyslogMessage.TextMessage(end); - - } - else { - Byte[] msgBuff = new Byte[buff.length-step]; - for (int i = 0;i < msgBuff.length;i++){ - msgBuff[i] = buff[i+step]; + if (start < buff.length){ + if (buff.length-start >= 3 && buff[start] == (byte) 0xEF && buff[start+1] == (byte) 0xBB && buff[start+2] == (byte) 0xBF){ + msg = new SyslogMessage.TextMessage(new String(buff,start+3,buff.length-start-3,StandardCharsets.UTF_8)); + } + else { + Byte[] msgBuff = new Byte[buff.length-start]; + for (int i = 0;i < msgBuff.length;i++){ + msgBuff[i] = buff[i+start]; + } + //BinaryMessage.toString() would only print the array reference, so print the content + msg = new SyslogMessage.BinaryMessage(msgBuff){ + @Override + public String toString(){ + return new String(buff,start,buff.length-start,StandardCharsets.UTF_8); + } + }; } - msg = new SyslogMessage.BinaryMessage(msgBuff); } return new SyslogMessage(fac,sev,hostname,appName,procID,msgID,null,msg);