[Cmake-commits] CMake branch, next, updated. v3.0.1-4810-ga4afd72
Nils Gladitz
nilsgladitz at gmail.com
Sat Aug 9 09:09:38 EDT 2014
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".
The branch, next has been updated
via a4afd728837d220977c22bdf05b768b70e7ae599 (commit)
via d6576d56bd269f83cd0c3c7f8b7e9479e73e733f (commit)
via a99b42a4101dfa29ef3ebbfcbac58226879fd2f3 (commit)
from 3fca1291167226c610f1d9f215fe10a4f4fa9b69 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=a4afd728837d220977c22bdf05b768b70e7ae599
commit a4afd728837d220977c22bdf05b768b70e7ae599
Merge: 3fca129 d6576d5
Author: Nils Gladitz <nilsgladitz at gmail.com>
AuthorDate: Sat Aug 9 09:09:36 2014 -0400
Commit: CMake Topic Stage <kwrobot at kitware.com>
CommitDate: Sat Aug 9 09:09:36 2014 -0400
Merge topic 'wix-acl' into next
d6576d56 CPackWIX: Implement CPACK_WIX_ACL (Access Control List) property
a99b42a4 CMake Nightly Date Stamp
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=d6576d56bd269f83cd0c3c7f8b7e9479e73e733f
commit d6576d56bd269f83cd0c3c7f8b7e9479e73e733f
Author: Nils Gladitz <nilsgladitz at gmail.com>
AuthorDate: Sat Aug 9 14:50:49 2014 +0200
Commit: Nils Gladitz <nilsgladitz at gmail.com>
CommitDate: Sat Aug 9 14:50:49 2014 +0200
CPackWIX: Implement CPACK_WIX_ACL (Access Control List) property
diff --git a/Help/manual/cmake-properties.7.rst b/Help/manual/cmake-properties.7.rst
index 17dadc2..9faf99a 100644
--- a/Help/manual/cmake-properties.7.rst
+++ b/Help/manual/cmake-properties.7.rst
@@ -312,6 +312,7 @@ Properties on Installed Files
/prop_inst/CPACK_NEVER_OVERWRITE.rst
/prop_inst/CPACK_PERMANENT.rst
+ /prop_inst/CPACK_WIX_ACL.rst
Deprecated Properties on Directories
diff --git a/Help/prop_inst/CPACK_WIX_ACL.rst b/Help/prop_inst/CPACK_WIX_ACL.rst
new file mode 100644
index 0000000..edc7571
--- /dev/null
+++ b/Help/prop_inst/CPACK_WIX_ACL.rst
@@ -0,0 +1,16 @@
+CPACK_WIX_ACL
+-------------
+
+Specifies access permissions for installed files.
+
+The property can contain multiple list entries,
+each of which has to match the following format.
+
+::
+ <user>[@<domain>]=<permission>[,<permission>]
+
+``<user>`` and ``<domain>`` specify the windows user and domain for which the
+``<Permission>`` element should be generated.
+
+``<permission>`` is any of the YesNoType attributes listed here:
+http://wixtoolset.org/documentation/manual/v3/xsd/wix/permission.html
diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt
index 7f36bb2..ac23430 100644
--- a/Source/CMakeLists.txt
+++ b/Source/CMakeLists.txt
@@ -604,13 +604,14 @@ endif()
if(WIN32)
set(CPACK_SRCS ${CPACK_SRCS}
CPack/WiX/cmCPackWIXGenerator.cxx
- CPack/WiX/cmWIXSourceWriter.cxx
+ CPack/WiX/cmWIXAccessControlList.cxx
CPack/WiX/cmWIXDirectoriesSourceWriter.cxx
CPack/WiX/cmWIXFeaturesSourceWriter.cxx
CPack/WiX/cmWIXFilesSourceWriter.cxx
- CPack/WiX/cmWIXRichTextFormatWriter.cxx
CPack/WiX/cmWIXPatch.cxx
CPack/WiX/cmWIXPatchParser.cxx
+ CPack/WiX/cmWIXRichTextFormatWriter.cxx
+ CPack/WiX/cmWIXSourceWriter.cxx
)
endif()
diff --git a/Source/CPack/WiX/cmWIXAccessControlList.cxx b/Source/CPack/WiX/cmWIXAccessControlList.cxx
new file mode 100644
index 0000000..aeec968
--- /dev/null
+++ b/Source/CPack/WiX/cmWIXAccessControlList.cxx
@@ -0,0 +1,149 @@
+/*============================================================================
+ CMake - Cross Platform Makefile Generator
+ Copyright 2014 Kitware, Inc.
+
+ Distributed under the OSI-approved BSD License (the "License");
+ see accompanying file Copyright.txt for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even the
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the License for more information.
+============================================================================*/
+
+#include "cmWIXAccessControlList.h"
+
+#include <CPack/cmCPackGenerator.h>
+
+#include <cmSystemTools.h>
+
+cmWIXAccessControlList::cmWIXAccessControlList(
+ cmCPackLog *logger,
+ cmInstalledFile const& installedFile,
+ cmWIXSourceWriter &sourceWriter):
+ Logger(logger),
+ InstalledFile(installedFile),
+ SourceWriter(sourceWriter)
+{
+
+}
+
+bool cmWIXAccessControlList::Apply()
+{
+ std::vector<std::string> entries;
+ this->InstalledFile.GetPropertyAsList("CPACK_WIX_ACL", entries);
+
+ for(size_t i = 0; i < entries.size(); ++i)
+ {
+ this->CreatePermissionElement(entries[i]);
+ }
+
+ return true;
+}
+
+void cmWIXAccessControlList::CreatePermissionElement(
+ std::string const& entry)
+{
+ std::string::size_type pos = entry.find('=');
+ if(pos == std::string::npos)
+ {
+ this->ReportError(entry, "Did not find mandatory '='");
+ return;
+ }
+
+ std::string user_and_domain = entry.substr(0, pos);
+ std::string permission_string = entry.substr(pos + 1);
+
+ pos = user_and_domain.find('@');
+ std::string user;
+ std::string domain;
+ if(pos != std::string::npos)
+ {
+ user = user_and_domain.substr(0, pos);
+ domain = user_and_domain.substr(pos + 1);
+ }
+ else
+ {
+ user = user_and_domain;
+ }
+
+ std::vector<std::string> permissions =
+ cmSystemTools::tokenize(permission_string, ",");
+
+ this->SourceWriter.BeginElement("Permission");
+ this->SourceWriter.AddAttribute("User", user);
+ if(domain.size())
+ {
+ this->SourceWriter.AddAttribute("Domain", domain);
+ }
+ for(size_t i = 0; i < permissions.size(); ++i)
+ {
+ this->EmitBooleanAttribute(entry,
+ cmSystemTools::TrimWhitespace(permissions[i]));
+ }
+ this->SourceWriter.EndElement("Permission");
+}
+
+void cmWIXAccessControlList::ReportError(
+ std::string const& entry,
+ std::string const& message)
+{
+ cmCPackLogger(cmCPackLog::LOG_ERROR,
+ "Failed processing ACL entry '" << entry <<
+ "': " << message << std::endl);
+}
+
+bool cmWIXAccessControlList::IsBooleanAttribute(std::string const& name)
+{
+ static const char* validAttributes[] =
+ {
+ "Append",
+ "ChangePermission",
+ "CreateChild",
+ "CreateFile",
+ "CreateLink",
+ "CreateSubkeys",
+ "Delete",
+ "DeleteChild",
+ "EnumerateSubkeys",
+ "Execute",
+ "FileAllRights",
+ "GenericAll",
+ "GenericExecute",
+ "GenericRead",
+ "GenericWrite",
+ "Notify",
+ "Read",
+ "ReadAttributes",
+ "ReadExtendedAttributes",
+ "ReadPermission",
+ "SpecificRightsAll",
+ "Synchronize",
+ "TakeOwnership",
+ "Traverse",
+ "Write",
+ "WriteAttributes",
+ "WriteExtendedAttributes",
+ 0
+ };
+
+ size_t i = 0;
+ while(validAttributes[i])
+ {
+ if(name == validAttributes[i++]) return true;
+ }
+
+ return false;
+}
+
+void cmWIXAccessControlList::EmitBooleanAttribute(
+ std::string const& entry, std::string const& name)
+{
+ if(!this->IsBooleanAttribute(name))
+ {
+ std::stringstream message;
+ message << "Unknown boolean attribute '" << name << "'";
+ this->ReportError(entry, message.str());
+ }
+
+ this->SourceWriter.AddAttribute(name, "yes");
+}
diff --git a/Source/CPack/WiX/cmWIXAccessControlList.h b/Source/CPack/WiX/cmWIXAccessControlList.h
new file mode 100644
index 0000000..20902f7
--- /dev/null
+++ b/Source/CPack/WiX/cmWIXAccessControlList.h
@@ -0,0 +1,46 @@
+/*============================================================================
+ CMake - Cross Platform Makefile Generator
+ Copyright 2014 Kitware, Inc.
+
+ Distributed under the OSI-approved BSD License (the "License");
+ see accompanying file Copyright.txt for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even the
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the License for more information.
+============================================================================*/
+
+#ifndef cmWIXAccessControlList_h
+#define cmWIXAccessControlList_h
+
+#include <cmInstalledFile.h>
+#include <CPack/cmCPackLog.h>
+
+#include "cmWIXSourceWriter.h"
+
+class cmWIXAccessControlList
+{
+public:
+ cmWIXAccessControlList(
+ cmCPackLog *logger,
+ cmInstalledFile const& installedFile,
+ cmWIXSourceWriter &sourceWriter);
+
+ bool Apply();
+
+private:
+ void CreatePermissionElement(std::string const& entry);
+
+ void ReportError(std::string const& entry, std::string const& message);
+
+ bool IsBooleanAttribute(std::string const& name);
+
+ void EmitBooleanAttribute(
+ std::string const& entry, std::string const& name);
+
+ cmCPackLog* Logger;
+ cmInstalledFile const& InstalledFile;
+ cmWIXSourceWriter &SourceWriter;
+};
+
+#endif
diff --git a/Source/CPack/WiX/cmWIXFilesSourceWriter.cxx b/Source/CPack/WiX/cmWIXFilesSourceWriter.cxx
index 451188e..0ad5d0c 100644
--- a/Source/CPack/WiX/cmWIXFilesSourceWriter.cxx
+++ b/Source/CPack/WiX/cmWIXFilesSourceWriter.cxx
@@ -11,6 +11,7 @@
============================================================================*/
#include "cmWIXFilesSourceWriter.h"
+#include "cmWIXAccessControlList.h"
#include <cmInstalledFile.h>
@@ -175,6 +176,12 @@ std::string cmWIXFilesSourceWriter::EmitComponentFile(
AddAttribute("ReadOnly", "yes");
}
+ if(installedFile)
+ {
+ cmWIXAccessControlList acl(Logger, *installedFile, *this);
+ acl.Apply();
+ }
+
patch.ApplyFragment(fileId, *this);
EndElement("File");
diff --git a/Source/CPack/WiX/cmWIXSourceWriter.h b/Source/CPack/WiX/cmWIXSourceWriter.h
index 65b7240..3957d96 100644
--- a/Source/CPack/WiX/cmWIXSourceWriter.h
+++ b/Source/CPack/WiX/cmWIXSourceWriter.h
@@ -45,6 +45,9 @@ public:
static std::string WindowsCodepageToUtf8(std::string const& value);
+protected:
+ cmCPackLog* Logger;
+
private:
enum State
{
@@ -58,8 +61,6 @@ private:
static std::string EscapeAttributeValue(std::string const& value);
- cmCPackLog* Logger;
-
cmsys::ofstream File;
State State;
diff --git a/Source/cmInstalledFile.cxx b/Source/cmInstalledFile.cxx
index 7813fcc..3483ecc 100644
--- a/Source/cmInstalledFile.cxx
+++ b/Source/cmInstalledFile.cxx
@@ -111,3 +111,14 @@ bool cmInstalledFile::GetPropertyAsBool(const std::string& prop) const
bool isSet = this->GetProperty(prop, value);
return isSet && cmSystemTools::IsOn(value.c_str());
}
+
+//----------------------------------------------------------------------------
+void cmInstalledFile::GetPropertyAsList(const std::string& prop,
+ std::vector<std::string>& list) const
+{
+ std::string value;
+ this->GetProperty(prop, value);
+
+ list.clear();
+ cmSystemTools::ExpandListArgument(value, list);
+}
diff --git a/Source/cmInstalledFile.h b/Source/cmInstalledFile.h
index df28221..0292cd1 100644
--- a/Source/cmInstalledFile.h
+++ b/Source/cmInstalledFile.h
@@ -66,6 +66,9 @@ public:
bool GetPropertyAsBool(const std::string& prop) const;
+ void GetPropertyAsList(const std::string& prop,
+ std::vector<std::string>& list) const;
+
void SetName(cmMakefile* mf, const std::string& name);
std::string const& GetName() const;
-----------------------------------------------------------------------
Summary of changes:
Help/manual/cmake-properties.7.rst | 1 +
Help/prop_inst/CPACK_WIX_ACL.rst | 16 +++
Source/CMakeLists.txt | 5 +-
Source/CMakeVersion.cmake | 2 +-
Source/CPack/WiX/cmWIXAccessControlList.cxx | 149 +++++++++++++++++++++++++++
Source/CPack/WiX/cmWIXAccessControlList.h | 46 +++++++++
Source/CPack/WiX/cmWIXFilesSourceWriter.cxx | 7 ++
Source/CPack/WiX/cmWIXSourceWriter.h | 5 +-
Source/cmInstalledFile.cxx | 11 ++
Source/cmInstalledFile.h | 3 +
10 files changed, 240 insertions(+), 5 deletions(-)
create mode 100644 Help/prop_inst/CPACK_WIX_ACL.rst
create mode 100644 Source/CPack/WiX/cmWIXAccessControlList.cxx
create mode 100644 Source/CPack/WiX/cmWIXAccessControlList.h
hooks/post-receive
--
CMake
More information about the Cmake-commits
mailing list