Skip to content

Commit

Permalink
Fix permissions for temporary files
Browse files Browse the repository at this point in the history
fixes #11212
fixes #11211
  • Loading branch information
Michael Friedrich committed Feb 24, 2016
1 parent 4c59ffa commit 47c5425
Show file tree
Hide file tree
Showing 14 changed files with 38 additions and 29 deletions.
2 changes: 1 addition & 1 deletion lib/base/configobject.cpp
Expand Up @@ -483,7 +483,7 @@ void ConfigObject::DumpObjects(const String& filename, int attributeTypes)
<< "Dumping program state to file '" << filename << "'";

std::fstream fp;
String tempFilename = Utility::CreateTempFile(filename + ".XXXXXX", fp);
String tempFilename = Utility::CreateTempFile(filename + ".XXXXXX", 0600, fp);

if (!fp)
BOOST_THROW_EXCEPTION(std::runtime_error("Could not open '" + tempFilename + "' file"));
Expand Down
2 changes: 1 addition & 1 deletion lib/base/scriptglobal.cpp
Expand Up @@ -66,7 +66,7 @@ void ScriptGlobal::WriteToFile(const String& filename)
<< "Dumping variables to file '" << filename << "'";

std::fstream fp;
String tempFilename = Utility::CreateTempFile(filename + ".XXXXXX", fp);
String tempFilename = Utility::CreateTempFile(filename + ".XXXXXX", 0600, fp);

if (!fp)
BOOST_THROW_EXCEPTION(std::runtime_error("Could not open '" + tempFilename + "' file"));
Expand Down
21 changes: 15 additions & 6 deletions lib/base/utility.cpp
Expand Up @@ -700,10 +700,10 @@ bool Utility::GlobRecursive(const String& path, const String& pattern, const boo
}


void Utility::MkDir(const String& path, int flags)
void Utility::MkDir(const String& path, int mode)
{
#ifndef _WIN32
if (mkdir(path.CStr(), flags) < 0 && errno != EEXIST) {
if (mkdir(path.CStr(), mode) < 0 && errno != EEXIST) {
#else /*_ WIN32 */
if (mkdir(path.CStr()) < 0 && errno != EEXIST) {
#endif /* _WIN32 */
Expand Down Expand Up @@ -1327,10 +1327,10 @@ Value Utility::LoadJsonFile(const String& path)
return JsonDecode(json);
}

void Utility::SaveJsonFile(const String& path, const Value& value)
void Utility::SaveJsonFile(const String& path, int mode, const Value& value)
{
std::fstream fp;
String tempFilename = Utility::CreateTempFile(path + ".XXXXXX", fp);
String tempFilename = Utility::CreateTempFile(path + ".XXXXXX", mode, fp);

fp.exceptions(std::ofstream::failbit | std::ofstream::badbit);
fp << JsonEncode(value);
Expand Down Expand Up @@ -1706,7 +1706,7 @@ String Utility::ValidateUTF8(const String& input)
return output;
}

String Utility::CreateTempFile(const String& path, std::fstream& fp)
String Utility::CreateTempFile(const String& path, int mode, std::fstream& fp)
{
std::vector<char> targetPath(path.Begin(), path.End());
targetPath.push_back('\0');
Expand Down Expand Up @@ -1734,7 +1734,16 @@ String Utility::CreateTempFile(const String& path, std::fstream& fp)

close(fd);

return String(targetPath.begin(), targetPath.end() - 1);
String resultPath = String(targetPath.begin(), targetPath.end() - 1);

if (chmod(resultPath.CStr(), mode) < 0) {
BOOST_THROW_EXCEPTION(posix_error()
<< boost::errinfo_api_function("chmod")
<< boost::errinfo_errno(errno)
<< boost::errinfo_file_name(resultPath));
}

return resultPath;
}

#ifdef _WIN32
Expand Down
4 changes: 2 additions & 2 deletions lib/base/utility.hpp
Expand Up @@ -131,7 +131,7 @@ class I2_BASE_API Utility
static void CopyFile(const String& source, const String& target);

static Value LoadJsonFile(const String& path);
static void SaveJsonFile(const String& path, const Value& value);
static void SaveJsonFile(const String& path, int mode, const Value& value);

static String GetPlatformKernel(void);
static String GetPlatformKernelVersion(void);
Expand All @@ -141,7 +141,7 @@ class I2_BASE_API Utility

static String ValidateUTF8(const String& input);

static String CreateTempFile(const String& path, std::fstream& fp);
static String CreateTempFile(const String& path, int mode, std::fstream& fp);

private:
Utility(void);
Expand Down
2 changes: 1 addition & 1 deletion lib/cli/apisetuputility.cpp
Expand Up @@ -171,7 +171,7 @@ bool ApiSetupUtility::SetupMasterApiUser(void)
NodeUtility::CreateBackupFile(apiUsersPath);

std::fstream fp;
String tempFilename = Utility::CreateTempFile(apiUsersPath + ".XXXXXX", fp);
String tempFilename = Utility::CreateTempFile(apiUsersPath + ".XXXXXX", 0640, fp);

fp << "/**\n"
<< " * The APIUser objects are used for authentication against the API.\n"
Expand Down
4 changes: 2 additions & 2 deletions lib/cli/nodesetupcommand.cpp
Expand Up @@ -170,7 +170,7 @@ int NodeSetupCommand::SetupMaster(const boost::program_options::variables_map& v
NodeUtility::CreateBackupFile(apipath);

std::fstream fp;
String tempApiPath = Utility::CreateTempFile(apipath + ".XXXXXX", fp);
String tempApiPath = Utility::CreateTempFile(apipath + ".XXXXXX", 0640, fp);

fp << "/**\n"
<< " * The API listener is used for distributed monitoring setups.\n"
Expand Down Expand Up @@ -374,7 +374,7 @@ int NodeSetupCommand::SetupNode(const boost::program_options::variables_map& vm,
NodeUtility::CreateBackupFile(apipath);

std::fstream fp;
String tempApiPath = Utility::CreateTempFile(apipath + ".XXXXXX", fp);
String tempApiPath = Utility::CreateTempFile(apipath + ".XXXXXX", 0640, fp);

fp << "/**\n"
<< " * The API listener is used for distributed monitoring setups.\n"
Expand Down
2 changes: 1 addition & 1 deletion lib/cli/nodeupdateconfigcommand.cpp
Expand Up @@ -415,7 +415,7 @@ int NodeUpdateConfigCommand::Run(const boost::program_options::variables_map& vm

/* store the new inventory for next run */
NodeUtility::CreateRepositoryPath();
Utility::SaveJsonFile(inventory_path, inventory);
Utility::SaveJsonFile(inventory_path, 0600, inventory);

std::cout << "Make sure to reload Icinga 2 for these changes to take effect." << std::endl;

Expand Down
12 changes: 6 additions & 6 deletions lib/cli/nodeutility.cpp
Expand Up @@ -166,7 +166,7 @@ void NodeUtility::AddNode(const String& name)
node->Set("repository", Empty);

CreateRepositoryPath();
Utility::SaveJsonFile(path, node);
Utility::SaveJsonFile(path, 0600, node);
}

void NodeUtility::AddNodeSettings(const String& name, const String& host,
Expand All @@ -179,7 +179,7 @@ void NodeUtility::AddNodeSettings(const String& name, const String& host,
settings->Set("log_duration", log_duration);

CreateRepositoryPath();
Utility::SaveJsonFile(GetNodeSettingsFile(name), settings);
Utility::SaveJsonFile(GetNodeSettingsFile(name), 0600, settings);
}

void NodeUtility::RemoveNode(const String& name)
Expand Down Expand Up @@ -386,7 +386,7 @@ bool NodeUtility::WriteNodeConfigObjects(const String& filename, const Array::Pt
}

std::fstream fp;
String tempFilename = Utility::CreateTempFile(filename + ".XXXXXX", fp);
String tempFilename = Utility::CreateTempFile(filename + ".XXXXXX", 0640, fp);

fp << "/*\n";
fp << " * Generated by Icinga 2 node setup commands\n";
Expand Down Expand Up @@ -470,7 +470,7 @@ int NodeUtility::UpdateBlackAndWhiteList(const String& type, const String& zone_

String list_path = GetBlackAndWhiteListPath(type);
CreateRepositoryPath();
Utility::SaveJsonFile(list_path, lists);
Utility::SaveJsonFile(list_path, 0600, lists);

return 0;
}
Expand Down Expand Up @@ -515,7 +515,7 @@ int NodeUtility::RemoveBlackAndWhiteList(const String& type, const String& zone_

String list_path = GetBlackAndWhiteListPath(type);
CreateRepositoryPath();
Utility::SaveJsonFile(list_path, lists);
Utility::SaveJsonFile(list_path, 0600, lists);

return 0;
}
Expand Down Expand Up @@ -640,7 +640,7 @@ void NodeUtility::UpdateConstant(const String& name, const String& value)

std::ifstream ifp(constantsFile.CStr());
std::fstream ofp;
String tempFile = Utility::CreateTempFile(constantsFile + ".XXXXXX", ofp);
String tempFile = Utility::CreateTempFile(constantsFile + ".XXXXXX", 0640, ofp);

bool found = false;

Expand Down
4 changes: 2 additions & 2 deletions lib/cli/nodewizardcommand.cpp
Expand Up @@ -413,7 +413,7 @@ int NodeWizardCommand::Run(const boost::program_options::variables_map& vm,
NodeUtility::CreateBackupFile(apipath);

std::fstream fp;
String tempApiPath = Utility::CreateTempFile(apipath + ".XXXXXX", fp);
String tempApiPath = Utility::CreateTempFile(apipath + ".XXXXXX", 0640, fp);

fp << "/**\n"
<< " * The API listener is used for distributed monitoring setups.\n"
Expand Down Expand Up @@ -538,7 +538,7 @@ int NodeWizardCommand::Run(const boost::program_options::variables_map& vm,


std::fstream fp;
String tempApiPath = Utility::CreateTempFile(apipath + ".XXXXXX", fp);
String tempApiPath = Utility::CreateTempFile(apipath + ".XXXXXX", 0640, fp);

fp << "/**\n"
<< " * The API listener is used for distributed monitoring setups.\n"
Expand Down
4 changes: 2 additions & 2 deletions lib/cli/repositoryutility.cpp
Expand Up @@ -357,7 +357,7 @@ bool RepositoryUtility::WriteObjectToRepositoryChangeLog(const String& path, con
CreateRepositoryPath(Utility::DirName(path));

std::fstream fp;
String tempFilename = Utility::CreateTempFile(path + ".XXXXXX", fp);
String tempFilename = Utility::CreateTempFile(path + ".XXXXXX", 0600, fp);

fp << JsonEncode(item);
fp.close();
Expand Down Expand Up @@ -497,7 +497,7 @@ bool RepositoryUtility::WriteObjectToRepository(const String& path, const String
CreateRepositoryPath(Utility::DirName(path));

std::fstream fp;
String tempFilename = Utility::CreateTempFile(path + ".XXXXXX", fp);
String tempFilename = Utility::CreateTempFile(path + ".XXXXXX", 0640, fp);

SerializeObject(fp, name, type, item);
fp << std::endl;
Expand Down
4 changes: 2 additions & 2 deletions lib/compat/statusdatawriter.cpp
Expand Up @@ -539,7 +539,7 @@ void StatusDataWriter::UpdateObjectsCache(void)
String objectsPath = GetObjectsPath();

std::fstream objectfp;
String tempObjectsPath = Utility::CreateTempFile(objectsPath + ".XXXXXX", objectfp);
String tempObjectsPath = Utility::CreateTempFile(objectsPath + ".XXXXXX", 0640, objectfp);

objectfp << std::fixed;

Expand Down Expand Up @@ -785,7 +785,7 @@ void StatusDataWriter::StatusTimerHandler(void)
String statusPath = GetStatusPath();

std::fstream statusfp;
String tempStatusPath = Utility::CreateTempFile(statusPath + ".XXXXXX", statusfp);
String tempStatusPath = Utility::CreateTempFile(statusPath + ".XXXXXX", 0640, statusfp);

statusfp << std::fixed;

Expand Down
2 changes: 1 addition & 1 deletion lib/config/configcompilercontext.cpp
Expand Up @@ -37,7 +37,7 @@ void ConfigCompilerContext::OpenObjectsFile(const String& filename)
m_ObjectsPath = filename;

std::fstream *fp = new std::fstream();
m_ObjectsTempFile = Utility::CreateTempFile(filename + ".XXXXXX", *fp);
m_ObjectsTempFile = Utility::CreateTempFile(filename + ".XXXXXX", 0600, *fp);

if (!*fp)
BOOST_THROW_EXCEPTION(std::runtime_error("Could not open '" + m_ObjectsTempFile + "' file"));
Expand Down
2 changes: 1 addition & 1 deletion lib/icinga/clusterevents.cpp
Expand Up @@ -724,7 +724,7 @@ Value ClusterEvents::UpdateRepositoryAPIHandler(const MessageOrigin::Ptr& origin
String repositoryFile = GetRepositoryDir() + SHA256(params->Get("endpoint")) + ".repo";

std::fstream fp;
String tempRepositoryFile = Utility::CreateTempFile(repositoryFile + ".XXXXXX", fp);
String tempRepositoryFile = Utility::CreateTempFile(repositoryFile + ".XXXXXX", 0640, fp);

fp << JsonEncode(params);
fp.close();
Expand Down
2 changes: 1 addition & 1 deletion lib/icinga/icingaapplication.cpp
Expand Up @@ -175,7 +175,7 @@ void IcingaApplication::DumpModifiedAttributes(void)
String path = GetModAttrPath();

std::fstream fp;
String tempFilename = Utility::CreateTempFile(path + ".XXXXXX", fp);
String tempFilename = Utility::CreateTempFile(path + ".XXXXXX", 0640, fp);

ConfigObject::Ptr previousObject;
ConfigObject::DumpModifiedAttributes(boost::bind(&PersistModAttrHelper, boost::ref(fp), boost::ref(previousObject), _1, _2, _3));
Expand Down

0 comments on commit 47c5425

Please sign in to comment.