Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions server.toml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ read_only = true
[AFP.Volumes.TestVolume]
name = "Test Volume" # Volume name. Max 31 characters.
path = 'C:\Mac\Test'
read_only = false
appledouble_mode = "modern" # per-volume override; "modern" (._ sidecars) or "legacy" (.appledouble folder)
rebuild_desktop_db = false

Expand Down
3 changes: 0 additions & 3 deletions service/afp/directory.go
Original file line number Diff line number Diff line change
Expand Up @@ -323,9 +323,6 @@ func (s *Service) handleSetDirParms(req *FPSetDirParmsReq) (*FPSetDirParmsRes, i
}

func (s *Service) handleCreateDir(req *FPCreateDirReq) (*FPCreateDirRes, int32) {
if s.fs == nil {
return &FPCreateDirRes{}, ErrAccessDenied
}
if s.volumeIsReadOnly(req.VolumeID) {
return &FPCreateDirRes{}, ErrVolLocked
}
Expand Down
5 changes: 2 additions & 3 deletions service/afp/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,6 @@ func (s *Service) handleSetFileParms(req *FPSetFileParmsReq) (*FPSetFileParmsRes
}

func (s *Service) handleCreateFile(req *FPCreateFileReq) (*FPCreateFileRes, int32) {
if s.fs == nil {
return &FPCreateFileRes{}, ErrAccessDenied
}
if s.volumeIsReadOnly(req.VolumeID) {
return &FPCreateFileRes{}, ErrVolLocked
}
Expand All @@ -41,6 +38,7 @@ func (s *Service) handleCreateFile(req *FPCreateFileReq) (*FPCreateFileRes, int3
if req.HasFlag(FPCreateFileFlagHardCreate) {
f, err := backend.CreateFile(targetPath)
if err != nil {
netlog.Debug("[AFP] FPCreateFile hard create %q failed: %v", targetPath, err)
return &FPCreateFileRes{}, ErrAccessDenied
}
f.Close()
Expand All @@ -50,6 +48,7 @@ func (s *Service) handleCreateFile(req *FPCreateFileReq) (*FPCreateFileRes, int3
if os.IsExist(err) {
return &FPCreateFileRes{}, ErrObjectExists
}
netlog.Debug("[AFP] FPCreateFile %q failed: %v", targetPath, err)
return &FPCreateFileRes{}, ErrAccessDenied
}
f.Close()
Expand Down
35 changes: 7 additions & 28 deletions service/afp/filedir.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,18 @@ import (

func (s *Service) handleGetFileDirParms(req *FPGetFileDirParmsReq) (*FPGetFileDirParmsRes, int32) {
if req.FileBitmap == 0 && req.DirBitmap == 0 {
return &FPGetFileDirParmsRes{}, ErrBitmapErr
return nil, ErrBitmapErr
}
if req.FileBitmap&^enumerateFileBitmapMask != 0 || req.DirBitmap&^enumerateDirBitmapMask != 0 {
return &FPGetFileDirParmsRes{}, ErrBitmapErr
return nil, ErrBitmapErr
}
if req.Path != "" && req.PathType != PathTypeShortNames && req.PathType != PathTypeLongNames {
return &FPGetFileDirParmsRes{}, ErrParamErr
return nil, ErrParamErr
}

parentPath, ok := s.resolveDIDPath(req.VolumeID, req.DirID)
if !ok && req.DirID != 0 {
return emptyGetFileDirParmsRes(req), ErrObjectNotFound
return nil, ErrObjectNotFound
} else if !ok && req.DirID == 0 {
parentPath, _ = s.resolveDIDPath(req.VolumeID, CNIDRoot)
}
Expand All @@ -32,10 +32,7 @@ func (s *Service) handleGetFileDirParms(req *FPGetFileDirParmsReq) (*FPGetFileDi
if req.Path != "" {
resolvedPath, errCode := s.resolvePath(parentPath, req.Path, req.PathType)
if errCode != NoErr {
if errCode == ErrObjectNotFound {
return emptyGetFileDirParmsRes(req), ErrObjectNotFound
}
return &FPGetFileDirParmsRes{}, errCode
return nil, errCode
}
targetPath = resolvedPath
}
Expand All @@ -48,12 +45,12 @@ func (s *Service) handleGetFileDirParms(req *FPGetFileDirParmsReq) (*FPGetFileDi
} else {
backend := s.fsForPath(targetPath)
if backend == nil {
return emptyGetFileDirParmsRes(req), ErrObjectNotFound
return nil, ErrObjectNotFound
}
info, err = backend.Stat(targetPath)
}
if err != nil {
return emptyGetFileDirParmsRes(req), ErrObjectNotFound
return nil, ErrObjectNotFound
}
targetPath = infoPath

Expand All @@ -76,21 +73,6 @@ func (s *Service) handleGetFileDirParms(req *FPGetFileDirParmsReq) (*FPGetFileDi
return res, NoErr
}

func emptyGetFileDirParmsRes(req *FPGetFileDirParmsReq) *FPGetFileDirParmsRes {
// Preserve a valid reply layout (bitmaps + File/DirFlag + pad) even on
// ObjectNotFound so clients can parse the envelope deterministically.
isFile := true
if req.FileBitmap == 0 && req.DirBitmap != 0 {
isFile = false
}
return &FPGetFileDirParmsRes{
FileBitmap: req.FileBitmap,
DirBitmap: req.DirBitmap,
IsFile: isFile,
Data: nil,
}
}

func (s *Service) handleRename(req *FPRenameReq) (*FPRenameRes, int32) {
if s.volumeIsReadOnly(req.VolumeID) {
return &FPRenameRes{}, ErrVolLocked
Expand Down Expand Up @@ -195,9 +177,6 @@ func (s *Service) handleSetFileDirParms(req *FPSetFileDirParmsReq) (*FPSetFileDi
}

func (s *Service) handleDelete(req *FPDeleteReq) (*FPDeleteRes, int32) {
if s.fs == nil {
return &FPDeleteRes{}, ErrAccessDenied
}
if s.volumeIsReadOnly(req.VolumeID) {
return &FPDeleteRes{}, ErrVolLocked
}
Expand Down
6 changes: 1 addition & 5 deletions service/afp/filedir_pack.go
Original file line number Diff line number Diff line change
Expand Up @@ -233,11 +233,7 @@ func (s *Service) packFileInfo(buf *bytes.Buffer, volumeID uint16, bitmap uint16
fixedSize := calcFileParamsSize(bitmap)

if bitmap&FileBitmapAttributes != 0 {
attr := uint16(0)
if s.volumeIsReadOnly(volumeID) {
attr |= FileAttrWriteInhibit
}
binutil.WriteU16(buf, attr)
binutil.WriteU16(buf, 0)
}
if bitmap&FileBitmapParentDID != 0 {
pdir := s.getPathDID(volumeID, parentPath)
Expand Down
74 changes: 0 additions & 74 deletions service/afp/getfiledirparms_error_response_test.go

This file was deleted.

12 changes: 6 additions & 6 deletions service/afp/getfiledirparms_validation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ func TestHandleGetFileDirParms_RejectsZeroBitmaps(t *testing.T) {
if errCode != ErrBitmapErr {
t.Fatalf("errCode=%d, want %d", errCode, ErrBitmapErr)
}
if res == nil {
t.Fatalf("expected non-nil response")
if res != nil {
t.Fatalf("expected nil response on error, got %+v", res)
}
}

Expand All @@ -41,8 +41,8 @@ func TestHandleGetFileDirParms_RejectsUnsupportedBitmapBits(t *testing.T) {
if errCode != ErrBitmapErr {
t.Fatalf("errCode=%d, want %d", errCode, ErrBitmapErr)
}
if res == nil {
t.Fatalf("expected non-nil response")
if res != nil {
t.Fatalf("expected nil response on error, got %+v", res)
}
}

Expand All @@ -61,7 +61,7 @@ func TestHandleGetFileDirParms_RejectsInvalidPathTypeWhenPathPresent(t *testing.
if errCode != ErrParamErr {
t.Fatalf("errCode=%d, want %d", errCode, ErrParamErr)
}
if res == nil {
t.Fatalf("expected non-nil response")
if res != nil {
t.Fatalf("expected nil response on error, got %+v", res)
}
}
2 changes: 1 addition & 1 deletion service/afp/testdata/fpgetsrvrinfores_basic.hex
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0016001f004d000080000b5465737420536572766572084f6d6e6954616c6b030e41465056657273696f6e20312e310e41465056657273696f6e20322e300e41465056657273696f6e20322e31020f4e6f20557365722041757468656e7410436c6561727478742050617373777264
001600230051000080000b54657374205365727665720c436c6173736963537461636b030e41465056657273696f6e20312e310e41465056657273696f6e20322e300e41465056657273696f6e20322e31020f4e6f20557365722041757468656e7410436c6561727478742050617373777264
2 changes: 1 addition & 1 deletion service/afp/testdata/fpgetsrvrmsgres_basic.hex
Original file line number Diff line number Diff line change
@@ -1 +1 @@
000100031357656c636f6d6520746f204f6d6e6954616c6b
000100031757656c636f6d6520746f20436c6173736963537461636b
Loading