SSH: set correct attributes when uploading a file.

Change-Id: I59484d5e66491e8941992abdd2a478364ec258a7
Reviewed-on: http://codereview.qt.nokia.com/710
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Christian Kandeler <christian.kandeler@nokia.com>
This commit is contained in:
Christian Kandeler
2011-06-24 14:57:03 +02:00
parent 9d7285687e
commit efbcb3860d
6 changed files with 54 additions and 20 deletions

View File

@@ -38,14 +38,6 @@
namespace Utils { namespace Utils {
namespace Internal { namespace Internal {
namespace {
const int SSH_FILEXFER_ATTR_SIZE = 0x00000001;
const int SSH_FILEXFER_ATTR_UIDGID = 0x00000002;
const int SSH_FILEXFER_ATTR_PERMISSIONS = 0x00000004;
const int SSH_FILEXFER_ATTR_ACMODTIME = 0x00000008;
const int SSH_FILEXFER_ATTR_EXTENDED = 0x80000000;
} // anonymous namespace
SftpIncomingPacket::SftpIncomingPacket() : m_length(0) SftpIncomingPacket::SftpIncomingPacket() : m_length(0)
{ {
} }

View File

@@ -121,7 +121,8 @@ SftpCreateFile::SftpCreateFile(SftpJobId jobId, const QString &path,
SftpOutgoingPacket & SftpCreateFile::initialPacket(SftpOutgoingPacket &packet) SftpOutgoingPacket & SftpCreateFile::initialPacket(SftpOutgoingPacket &packet)
{ {
state = OpenRequested; state = OpenRequested;
return packet.generateOpenFileForWriting(remotePath, mode, jobId); return packet.generateOpenFileForWriting(remotePath, mode,
SftpOutgoingPacket::DefaultPermissions, jobId);
} }
@@ -176,10 +177,29 @@ SftpUploadFile::SftpUploadFile(SftpJobId jobId, const QString &remotePath,
SftpOutgoingPacket &SftpUploadFile::initialPacket(SftpOutgoingPacket &packet) SftpOutgoingPacket &SftpUploadFile::initialPacket(SftpOutgoingPacket &packet)
{ {
state = OpenRequested; state = OpenRequested;
return packet.generateOpenFileForWriting(remotePath, mode, jobId); quint32 permissions = 0;
const QFile::Permissions &qtPermissions = localFile->permissions();
if (qtPermissions & QFile::ExeOther)
permissions |= 1 << 0;
if (qtPermissions & QFile::WriteOther)
permissions |= 1 << 1;
if (qtPermissions & QFile::ReadOther)
permissions |= 1 << 2;
if (qtPermissions & QFile::ExeGroup)
permissions |= 1<< 3;
if (qtPermissions & QFile::WriteGroup)
permissions |= 1<< 4;
if (qtPermissions & QFile::ReadGroup)
permissions |= 1<< 5;
if (qtPermissions & QFile::ExeOwner)
permissions |= 1<< 6;
if (qtPermissions & QFile::WriteOwner)
permissions |= 1<< 7;
if (qtPermissions & QFile::ReadOwner)
permissions |= 1<< 8;
return packet.generateOpenFileForWriting(remotePath, mode, permissions, jobId);
} }
SftpUploadDir::~SftpUploadDir() {} SftpUploadDir::~SftpUploadDir() {}
} // namespace Internal } // namespace Internal

View File

@@ -36,6 +36,8 @@
#include <QtCore/QtEndian> #include <QtCore/QtEndian>
#include <limits>
namespace Utils { namespace Utils {
namespace Internal { namespace Internal {
@@ -103,16 +105,22 @@ SftpOutgoingPacket &SftpOutgoingPacket::generateRename(const QString &oldPath,
} }
SftpOutgoingPacket &SftpOutgoingPacket::generateOpenFileForWriting(const QString &path, SftpOutgoingPacket &SftpOutgoingPacket::generateOpenFileForWriting(const QString &path,
SftpOverwriteMode mode, quint32 requestId) SftpOverwriteMode mode, quint32 permissions, quint32 requestId)
{ {
return generateOpenFile(path, Write, mode, requestId); QList<quint32> attributes;
if (permissions != DefaultPermissions)
attributes << SSH_FILEXFER_ATTR_PERMISSIONS << permissions;
else
attributes << DefaultAttributes;
return generateOpenFile(path, Write, mode, attributes, requestId);
} }
SftpOutgoingPacket &SftpOutgoingPacket::generateOpenFileForReading(const QString &path, SftpOutgoingPacket &SftpOutgoingPacket::generateOpenFileForReading(const QString &path,
quint32 requestId) quint32 requestId)
{ {
// Note: Overwrite mode is irrelevant and will be ignored. // Note: Overwrite mode is irrelevant and will be ignored.
return generateOpenFile(path, Read, SftpSkipExisting, requestId); return generateOpenFile(path, Read, SftpSkipExisting, QList<quint32>() << DefaultAttributes,
requestId);
} }
SftpOutgoingPacket &SftpOutgoingPacket::generateReadFile(const QByteArray &handle, SftpOutgoingPacket &SftpOutgoingPacket::generateReadFile(const QByteArray &handle,
@@ -136,7 +144,7 @@ SftpOutgoingPacket &SftpOutgoingPacket::generateWriteFile(const QByteArray &hand
} }
SftpOutgoingPacket &SftpOutgoingPacket::generateOpenFile(const QString &path, SftpOutgoingPacket &SftpOutgoingPacket::generateOpenFile(const QString &path,
OpenType openType, SftpOverwriteMode mode, quint32 requestId) OpenType openType, SftpOverwriteMode mode, const QList<quint32> &attributes, quint32 requestId)
{ {
quint32 pFlags; quint32 pFlags;
switch (openType) { switch (openType) {
@@ -152,8 +160,11 @@ SftpOutgoingPacket &SftpOutgoingPacket::generateOpenFile(const QString &path,
} }
break; break;
} }
return init(SSH_FXP_OPEN, requestId).appendString(path).appendInt(pFlags)
.appendInt(DefaultAttributes).finalize(); init(SSH_FXP_OPEN, requestId).appendString(path).appendInt(pFlags);
foreach (const quint32 attribute, attributes)
appendInt(attribute);
return finalize();
} }
SftpOutgoingPacket &SftpOutgoingPacket::init(SftpPacketType type, SftpOutgoingPacket &SftpOutgoingPacket::init(SftpPacketType type,
@@ -201,5 +212,7 @@ SftpOutgoingPacket &SftpOutgoingPacket::finalize()
return *this; return *this;
} }
const quint32 SftpOutgoingPacket::DefaultPermissions = std::numeric_limits<quint32>::max();
} // namespace Internal } // namespace Internal
} // namespace Utils } // namespace Utils

View File

@@ -55,7 +55,7 @@ public:
SftpOutgoingPacket &generateRename(const QString &oldPath, SftpOutgoingPacket &generateRename(const QString &oldPath,
const QString &newPath, quint32 requestId); const QString &newPath, quint32 requestId);
SftpOutgoingPacket &generateOpenFileForWriting(const QString &path, SftpOutgoingPacket &generateOpenFileForWriting(const QString &path,
SftpOverwriteMode mode, quint32 requestId); SftpOverwriteMode mode, quint32 permissions, quint32 requestId);
SftpOutgoingPacket &generateOpenFileForReading(const QString &path, SftpOutgoingPacket &generateOpenFileForReading(const QString &path,
quint32 requestId); quint32 requestId);
SftpOutgoingPacket &generateReadFile(const QByteArray &handle, SftpOutgoingPacket &generateReadFile(const QByteArray &handle,
@@ -65,12 +65,14 @@ public:
SftpOutgoingPacket &generateWriteFile(const QByteArray &handle, SftpOutgoingPacket &generateWriteFile(const QByteArray &handle,
quint64 offset, const QByteArray &data, quint32 requestId); quint64 offset, const QByteArray &data, quint32 requestId);
static const quint32 DefaultPermissions;
private: private:
static QByteArray encodeString(const QString &string); static QByteArray encodeString(const QString &string);
enum OpenType { Read, Write }; enum OpenType { Read, Write };
SftpOutgoingPacket &generateOpenFile(const QString &path, OpenType openType, SftpOutgoingPacket &generateOpenFile(const QString &path, OpenType openType,
SftpOverwriteMode mode, quint32 requestId); SftpOverwriteMode mode, const QList<quint32> &attributes, quint32 requestId);
SftpOutgoingPacket &init(SftpPacketType type, quint32 requestId); SftpOutgoingPacket &init(SftpPacketType type, quint32 requestId);
SftpOutgoingPacket &appendInt(quint32 value); SftpOutgoingPacket &appendInt(quint32 value);

View File

@@ -43,7 +43,6 @@ const int AbstractSftpPacket::TypeOffset = 4;
const int AbstractSftpPacket::RequestIdOffset = TypeOffset + 1; const int AbstractSftpPacket::RequestIdOffset = TypeOffset + 1;
const int AbstractSftpPacket::PayloadOffset = RequestIdOffset + 4; const int AbstractSftpPacket::PayloadOffset = RequestIdOffset + 4;
AbstractSftpPacket::AbstractSftpPacket() AbstractSftpPacket::AbstractSftpPacket()
{ {
} }

View File

@@ -84,6 +84,14 @@ enum SftpStatusCode {
SSH_FX_OP_UNSUPPORTED = 8 SSH_FX_OP_UNSUPPORTED = 8
}; };
enum SftpAttributeType {
SSH_FILEXFER_ATTR_SIZE = 0x00000001,
SSH_FILEXFER_ATTR_UIDGID = 0x00000002,
SSH_FILEXFER_ATTR_PERMISSIONS = 0x00000004,
SSH_FILEXFER_ATTR_ACMODTIME = 0x00000008,
SSH_FILEXFER_ATTR_EXTENDED = 0x80000000
};
class AbstractSftpPacket class AbstractSftpPacket
{ {
public: public: