phpseclib\Net\SFTP::_parseAttributes PHP Method

_parseAttributes() public method

See '7. File Attributes' of draft-ietf-secsh-filexfer-13 for more info.
public _parseAttributes ( string &$response ) : array
$response string
return array
    function _parseAttributes(&$response)
    {
        $attr = array();
        if (strlen($response) < 4) {
            //user_error('Malformed file attributes');
            return array();
        }
        extract(unpack('Nflags', Strings::shift($response, 4)));
        // SFTPv4+ have a type field (a byte) that follows the above flag field
        foreach ($this->attributes as $key => $value) {
            switch ($flags & $key) {
                case NET_SFTP_ATTR_SIZE:
                    // 0x00000001
                    // The size attribute is defined as an unsigned 64-bit integer.
                    // The following will use floats on 32-bit platforms, if necessary.
                    // As can be seen in the BigInteger class, floats are generally
                    // IEEE 754 binary64 "double precision" on such platforms and
                    // as such can represent integers of at least 2^50 without loss
                    // of precision. Interpreted in filesize, 2^50 bytes = 1024 TiB.
                    $attr['size'] = hexdec(Hex::encode(Strings::shift($response, 8)));
                    break;
                case NET_SFTP_ATTR_UIDGID:
                    // 0x00000002 (SFTPv3 only)
                    if (strlen($response) < 8) {
                        //user_error('Malformed file attributes');
                        return $attr;
                    }
                    $attr += unpack('Nuid/Ngid', Strings::shift($response, 8));
                    break;
                case NET_SFTP_ATTR_PERMISSIONS:
                    // 0x00000004
                    if (strlen($response) < 4) {
                        //user_error('Malformed file attributes');
                        return $attr;
                    }
                    $attr += unpack('Npermissions', Strings::shift($response, 4));
                    // mode == permissions; permissions was the original array key and is retained for bc purposes.
                    // mode was added because that's the more industry standard terminology
                    $attr += array('mode' => $attr['permissions']);
                    $fileType = $this->_parseMode($attr['permissions']);
                    if ($fileType !== false) {
                        $attr += array('type' => $fileType);
                    }
                    break;
                case NET_SFTP_ATTR_ACCESSTIME:
                    // 0x00000008
                    if (strlen($response) < 8) {
                        //user_error('Malformed file attributes');
                        return $attr;
                    }
                    $attr += unpack('Natime/Nmtime', Strings::shift($response, 8));
                    break;
                case NET_SFTP_ATTR_EXTENDED:
                    // 0x80000000
                    if (strlen($response) < 4) {
                        //user_error('Malformed file attributes');
                        return $attr;
                    }
                    extract(unpack('Ncount', Strings::shift($response, 4)));
                    for ($i = 0; $i < $count; $i++) {
                        if (strlen($response) < 4) {
                            //user_error('Malformed file attributes');
                            return $attr;
                        }
                        extract(unpack('Nlength', Strings::shift($response, 4)));
                        $key = Strings::shift($response, $length);
                        if (strlen($response) < 4) {
                            //user_error('Malformed file attributes');
                            return $attr;
                        }
                        extract(unpack('Nlength', Strings::shift($response, 4)));
                        $attr[$key] = Strings::shift($response, $length);
                    }
            }
        }
        return $attr;
    }