fixed SF# 2583934: Zip: No Unix permissions set

This commit is contained in:
Guenter Obiltschnig 2009-02-18 16:04:14 +00:00
parent 717dd9cf45
commit 12c1ae5823
4 changed files with 1284 additions and 1252 deletions

View File

@ -1,7 +1,7 @@
//
// ZipFileInfo.h
//
// $Id: //poco/1.3/Zip/include/Poco/Zip/ZipFileInfo.h#3 $
// $Id: //poco/Main/Zip/include/Poco/Zip/ZipFileInfo.h#8 $
//
// Library: Zip
// Package: Zip
@ -139,6 +139,8 @@ private:
void setFileName(const std::string& str);
void setExternalFileAttributes(Poco::UInt32 attrs);
void parse(std::istream& in, bool assumeHeaderRead);
void parseDateTime();
@ -157,6 +159,8 @@ private:
Poco::UInt32 getExternalFileAttributes() const;
void setUnixAttributes();
private:
enum
{
@ -196,6 +200,12 @@ private:
FULLHEADER_SIZE = 46
};
enum
{
DEFAULT_UNIX_FILE_MODE = 0640,
DEFAULT_UNIX_DIR_MODE = 0755
};
char _rawInfo[FULLHEADER_SIZE];
Poco::UInt32 _crc32;
Poco::UInt32 _compressedSize;
@ -462,6 +472,12 @@ inline void ZipFileInfo::setFileName(const std::string& str)
}
inline void ZipFileInfo::setExternalFileAttributes(Poco::UInt32 attrs)
{
ZipUtil::set32BitValue(attrs, _rawInfo, EXTERNALFILE_ATTR_POS);
}
} } // namespace Poco::Zip

View File

@ -1,7 +1,7 @@
//
// Compress.cpp
//
// $Id: //poco/1.3/Zip/src/Compress.cpp#4 $
// $Id: //poco/Main/Zip/src/Compress.cpp#8 $
//
// Library: Zip
// Package: Zip
@ -180,7 +180,6 @@ void Compress::addFile(const Poco::Path& file, const Poco::Path& fileName, ZipCo
cm = ZipCommon::CM_STORE;
cl = ZipCommon::CL_NORMAL;
}
std::ifstream in(file.toString().c_str(), std::ios::binary);
if (!in.good())
throw ZipException("Invalid input stream for " + aFile.path());
@ -189,6 +188,7 @@ void Compress::addFile(const Poco::Path& file, const Poco::Path& fileName, ZipCo
Poco::File aParent(file.parent());
addDirectory(fileName.parent(), aParent.getLastModified());
}
addFile(in, aFile.getLastModified(), fileName, cm, cl);
}

View File

@ -1,7 +1,7 @@
//
// ZipFileInfo.cpp
//
// $Id: //poco/1.3/Zip/src/ZipFileInfo.cpp#4 $
// $Id: //poco/Main/Zip/src/ZipFileInfo.cpp#9 $
//
// Library: Zip
// Package: Zip
@ -69,6 +69,9 @@ ZipFileInfo::ZipFileInfo(const ZipLocalFileHeader& header):
setLastModifiedAt(header.lastModifiedAt());
setEncryption(false);
setFileName(header.getFileName());
if (getHostSystem() == ZipCommon::HS_UNIX)
setUnixAttributes();
}
@ -140,4 +143,17 @@ std::string ZipFileInfo::createHeader() const
}
void ZipFileInfo::setUnixAttributes()
{
bool isDir = isDirectory();
int mode;
if (isDir)
mode = DEFAULT_UNIX_DIR_MODE;
else
mode = DEFAULT_UNIX_FILE_MODE;
Poco::UInt32 attrs = (mode << 16) | (isDir ? 0x10 : 0);
setExternalFileAttributes(attrs);
}
} } // namespace Poco::Zip

View File

@ -1,7 +1,7 @@
//
// ZipStream.cpp
//
// $Id: //poco/1.3/Zip/src/ZipStream.cpp#4 $
// $Id: //poco/Main/Zip/src/ZipStream.cpp#14 $
//
// Library: Zip
// Package: Zip