nwconn: persist additional AFP metadata attributes
All checks were successful
Source release / source-package (push) Successful in 49s
All checks were successful
Source release / source-package (push) Successful in 49s
Extend the conservative AFP 2.0 Set File Information smoke path to accept the metadata-only System and Backup file attribute bits alongside the already-supported Finder Invisible bit. The WebSDK/NWAFP Set File Information request uses the file Attributes bitmap to pass a set/clear attribute word. Netatalk stores several AFP file attributes in AppleDouble metadata while computing open-fork state dynamically and leaving enforcement-sensitive bits to the file/fork paths. Mirror only the low-risk mars_nwe subset here: persist Invisible, System, and Backup in the private org.mars-nwe.afp.attributes xattr, and keep NoWrite, NoRename, NoDelete, NoCopy, data-fork-open, resource-fork-open, timestamps, resource forks, and Entry-ID-only write semantics rejected until they have deliberate enforcement and backend design. The xattr payload remains versioned and unchanged. Reads now expose the three supported metadata bits through Get/Scan File Information, and writes preserve the existing set/clear semantics over the supported mask. Update the Linux Set File Information smoke helper with --system/--clear-system and --backup/--clear-backup options, while keeping the smoke-suite default unchanged. Document the expected Linux xattr forms 0x01000004 and 0x01000040 for those optional probes. Tests: git diff --check; gcc -Iinclude -I/mnt/data/stubs -fsyntax-only tests/linux/afp_set_file_info_smoke.c.
This commit is contained in:
@@ -23,7 +23,11 @@
|
||||
#define MARS_NWE_AFP_ATTRIBUTES_VERSION 1
|
||||
|
||||
#define NWATALK_AFP_ATTR_INVISIBLE 0x0001
|
||||
#define NWATALK_AFP_ATTR_SYSTEM 0x0004
|
||||
#define NWATALK_AFP_ATTR_BACKUP 0x0040
|
||||
#define NWATALK_AFP_ATTR_SETCLR 0x8000
|
||||
#define NWATALK_AFP_ATTR_STORED_MASK \
|
||||
(NWATALK_AFP_ATTR_INVISIBLE | NWATALK_AFP_ATTR_SYSTEM | NWATALK_AFP_ATTR_BACKUP)
|
||||
|
||||
typedef struct {
|
||||
uint8 version;
|
||||
@@ -185,7 +189,7 @@ int nwatalk_get_afp_attributes(const char *path, uint16 *attributes)
|
||||
len = mars_nwe_getxattr(path, MARS_NWE_AFP_ATTRIBUTES_XATTR,
|
||||
&d, sizeof(d));
|
||||
if (len == sizeof(d) && d.version == MARS_NWE_AFP_ATTRIBUTES_VERSION) {
|
||||
*attributes = GET_BE16(d.attributes) & NWATALK_AFP_ATTR_INVISIBLE;
|
||||
*attributes = GET_BE16(d.attributes) & NWATALK_AFP_ATTR_STORED_MASK;
|
||||
return(0);
|
||||
}
|
||||
#else
|
||||
@@ -205,7 +209,7 @@ int nwatalk_set_afp_attributes(const char *path, uint16 attributes)
|
||||
|
||||
if (!path || !*path) return(-0x9c);
|
||||
|
||||
if (requested & ~NWATALK_AFP_ATTR_INVISIBLE) {
|
||||
if (requested & ~NWATALK_AFP_ATTR_STORED_MASK) {
|
||||
XDPRINTF((3,0,"AFP attributes xattr write rejected for %s attrs=0x%04x", path, attributes));
|
||||
return(-0x9c);
|
||||
}
|
||||
|
||||
11
src/nwconn.c
11
src/nwconn.c
@@ -1096,7 +1096,11 @@ static int afp_get_file_information(uint8 *afp_req, int afp_len,
|
||||
#define AFP_FILE_BITMAP_ATTRIBUTES 0x0001
|
||||
#define AFP_FILE_BITMAP_FINDER_INFO 0x0020
|
||||
#define AFP_ATTR_INVISIBLE 0x0001
|
||||
#define AFP_ATTR_SYSTEM 0x0004
|
||||
#define AFP_ATTR_BACKUP 0x0040
|
||||
#define AFP_ATTR_SETCLR 0x8000
|
||||
#define AFP_ATTR_STORED_MASK \
|
||||
(AFP_ATTR_INVISIBLE | AFP_ATTR_SYSTEM | AFP_ATTR_BACKUP)
|
||||
|
||||
static int afp_set_file_information(uint8 *afp_req, int afp_len,
|
||||
const char *call_name)
|
||||
@@ -1173,7 +1177,7 @@ static int afp_set_file_information(uint8 *afp_req, int afp_len,
|
||||
if (request_mask & AFP_FILE_BITMAP_ATTRIBUTES) {
|
||||
uint16 requested_attrs = GET_BE16(afp_req + data_off);
|
||||
uint16 requested_bits = requested_attrs & ~AFP_ATTR_SETCLR;
|
||||
if (requested_bits & ~AFP_ATTR_INVISIBLE) {
|
||||
if (requested_bits & ~AFP_ATTR_STORED_MASK) {
|
||||
XDPRINTF((2,0, "%s rejected: unsupported AFP attributes attrs=0x%04x path='%s'",
|
||||
call_name, requested_attrs, visable_data(afp_req + 9, path_len)));
|
||||
return(-0x9c);
|
||||
@@ -3358,8 +3362,9 @@ static int handle_ncp_serv(void)
|
||||
* effective rights. Then expose
|
||||
* the read-only AFP Get File Information query for the same
|
||||
* SYS:-style path inputs. AFP 2.0 Set File Information
|
||||
* accepts only the FinderInfo bitmap as a metadata-only
|
||||
* xattr write smoke path. AFP 2.0 Get File Information
|
||||
* accepts only FinderInfo plus the
|
||||
* metadata-only Invisible/System/Backup file attributes as
|
||||
* xattr write smoke paths. AFP 2.0 Get File Information
|
||||
* uses the same request/reply layout for this read-only
|
||||
* path-backed subset, so route it through the same helper
|
||||
* until persistent entry-id lookup and richer AFP 2.0
|
||||
|
||||
Reference in New Issue
Block a user