diff --git a/main.go b/main.go index 32ea9b4..4bbd043 100644 --- a/main.go +++ b/main.go @@ -14,37 +14,53 @@ var ( logger logging.Logger ) -func handleMtaConnection(clientConnection *bufio.ReadWriter) { +type milterPacket struct { + payloadLength uint32 + message string + payload []byte +} + +type smficOptineg struct { + version uint32 + actions uint32 + protocol uint32 +} + +func readRequestPacket(clientConnection *bufio.ReadWriter) (milterPacket, error) { buf := make([]byte, 4096) + bytesRead, err := clientConnection.Read(buf) + if err != nil { + logger.Errorln("Error reading from clientConnection:", err.Error()) + return milterPacket{}, err + } + logger.Infof("Read %d bytes from connection\n", bytesRead) + logger.Debugf("Hexdump of bytes read:\n%s", hex.Dump(buf[0:bytesRead])) + reqPacket := milterPacket{} + // First 4 Bytes will be some integer thing "length" + bytesReader := bytes.NewReader(buf[0:4]) + err = binary.Read(bytesReader, binary.BigEndian, &reqPacket.payloadLength) + if err != nil { + logger.Errorln(err.Error()) + } + logger.Debugf("Parsed length: %d\n", reqPacket.payloadLength) + // Next up is a character, indicating the milter command + logger.Debugf("Parsing command from byte: %X\n", buf[4]) + reqPacket.message = string(buf[4]) + logger.Debugf("Parsed packet command: %s\n", reqPacket.message) + // Last part is data with lenght len-1 + reqPacket.payload = buf[5 : 5+reqPacket.payloadLength-1] + logger.Debugf("Hexdump of packet payload read:\n%s", hex.Dump(reqPacket.payload)) + // That's it, we're done. + return reqPacket, nil +} + +func handleMtaConnection(clientConnection *bufio.ReadWriter) { for { - bytesRead, err := clientConnection.Read(buf) - if err != nil { - logger.Errorln("Error reading from clientConnection:", err.Error()) - break - } else { - logger.Infof("Read %d bytes from connection\n", bytesRead) - logger.Debugf("Hexdump of bytes read:\n%s", hex.Dump(buf[0:bytesRead])) - - // First 4 Bytes will be some integer thing "length" - // Let's parse that - var packetLength uint32 - bytesReader := bytes.NewReader(buf[0:4]) - err := binary.Read(bytesReader, binary.BigEndian, &packetLength) - if err != nil { - logger.Errorln(err.Error()) - } - logger.Debugf("Parsed length: %d\n", packetLength) - - // Next up is a character, indicating the milter command - logger.Debugf("Parsing command from byte: %X\n", buf[4]) - command := string(buf[4]) - logger.Debugf("Parsed packet command: %s\n", command) - - // Last part is data with lenght len-1 - data := make([]byte, packetLength) - data = buf[5 : 5+packetLength-1] - logger.Debugf("Hexdump of packet payload read:\n%s", hex.Dump(data)) + request, _ := readRequestPacket(clientConnection) + if request.message == "O" { + responsePayload := smficOptineg{2, 0, 2} + //clientConnection.Write() } } }