From 959282dde27425a3dea2b2be1f7fb7ff3f94e905 Mon Sep 17 00:00:00 2001 From: j-shomo Date: Tue, 18 Mar 2025 03:12:58 -0400 Subject: [PATCH] add methods for setfileparams, addappl, and getappl --- protocol/afp/afp.go | 106 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 105 insertions(+), 1 deletion(-) diff --git a/protocol/afp/afp.go b/protocol/afp/afp.go index 741bb44..e898a73 100644 --- a/protocol/afp/afp.go +++ b/protocol/afp/afp.go @@ -726,13 +726,117 @@ func MoveAndRenameFile(conn net.Conn, srcVolID uint16, srcDirID uint32, srcPath return ok } +// Sends the AddAppl command to the AFP server. +func AddAppl(conn net.Conn, volID uint16, dirID uint32, creator [4]byte, applTag [4]byte, path string) bool { + data := []byte{} + data = append(data, AFPAddAppl) + data = append(data, byte(0x00)) + volIDBytes := make([]byte, 2) + binary.BigEndian.PutUint16(volIDBytes, volID) + data = append(data, volIDBytes...) + dirIDBytes := make([]byte, 4) + binary.BigEndian.PutUint32(dirIDBytes, dirID) + data = append(data, dirIDBytes...) + data = append(data, creator[0]) + data = append(data, creator[1]) + data = append(data, creator[2]) + data = append(data, creator[3]) + data = append(data, applTag[0]) + data = append(data, applTag[1]) + data = append(data, applTag[2]) + data = append(data, applTag[3]) + data = append(data, byte(0x2)) + data = append(data, uint8(len(path))) + data = append(data, []byte(path)...) + + packet := CreateFPPacket(DSICommand, data) + + // send message + ok := WritePacket(conn, packet) + if !ok { + return false + } + + // read response + _, ok = ReadPacket(conn) + + return ok +} + +// Sends the GetAppl command to the AFP server. +func GetAppl(conn net.Conn, volID uint16, creator [4]byte, aIndex uint16, bitmap uint16) (*FPPacket, bool) { + data := []byte{} + data = append(data, AFPGetAppl) + data = append(data, byte(0x00)) + volIDBytes := make([]byte, 2) + binary.BigEndian.PutUint16(volIDBytes, volID) + data = append(data, volIDBytes...) + data = append(data, creator[0]) + data = append(data, creator[1]) + data = append(data, creator[2]) + data = append(data, creator[3]) + aIndexBytes := make([]byte, 2) + binary.BigEndian.PutUint16(aIndexBytes, aIndex) + data = append(data, aIndexBytes...) + bitmapBytes := make([]byte, 2) + binary.BigEndian.PutUint16(bitmapBytes, bitmap) + data = append(data, bitmapBytes...) + + packet := CreateFPPacket(DSICommand, data) + + // send message + ok := WritePacket(conn, packet) + if !ok { + return nil, false + } + + // read response + response, ok := ReadPacket(conn) + + return response, ok +} + + +// Sends the setfileparams command to the AFP server. +func SetFilParams(conn net.Conn, volID uint16, dirID uint32, bitmap uint16, path string, buffer []byte) bool { + data := []byte{} + data = append(data, AFPSetFileParams) + data = append(data, byte(0x00)) + volIDBytes := make([]byte, 2) + binary.BigEndian.PutUint16(volIDBytes, volID) + data = append(data, volIDBytes...) + dirIDBytes := make([]byte, 4) + binary.BigEndian.PutUint32(dirIDBytes, dirID) + data = append(data, dirIDBytes...) + bitmapBytes := make([]byte, 2) + binary.BigEndian.PutUint16(bitmapBytes, bitmap) + data = append(data, bitmapBytes...) + data = append(data, byte(0x2)) + data = append(data, uint8(len(path))) + data = append(data, []byte(path)...) + data = append(data, buffer...) + + packet := CreateFPPacket(DSICommand, data) + + // send message + ok := WritePacket(conn, packet) + if !ok { + return false + } + + // read response + _, ok = ReadPacket(conn) + + return ok +} + + // Sends the Delete command to the AFP server. func Delete(conn net.Conn, volumeID uint16, dirID uint32, path string) bool { // requires protocol 3.2 and specific support configured at build time. pathElements := strings.Split(path, "/") fileName := pathElements[len(pathElements)-1] - // from nmap lua library -- data = string.pack( ">BBI2I4I2I2", COMMAND.FPOpenFork, flag, volume_id, did, file_bitmap, access_mode ) .. encode_path(path) data := []byte{} data = append(data, AFPDelete) data = append(data, byte(0x00))