161980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence#include <string> 261980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence#include <fstream> 361980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence 461980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence// key names for properties we use 561980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrencenamespace properties { 661980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence extern const char* key; 761980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence extern const char* ref; 82ecc64285a67bad1f942581f5bd9f361d689d37cPaul Lawrence extern const char* props; 9bc2eb8c3fd621605ff1ccaed04a71e6685acc974Paul Lawrence extern const char* is_default; 1061980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence} 1161980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence 1261980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence/** 1361980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence * Class to store data on the unencrypted folder of a device. 1461980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence * Note that the folder must exist before this class is constructed. 1561980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence * All names must be valid single level (no '/') file or directory names 1661980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence * Data is organized hierarchically so we can get a child folder 1761980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence */ 1861980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrenceclass UnencryptedProperties 1961980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence{ 2061980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrencepublic: 21bc2eb8c3fd621605ff1ccaed04a71e6685acc974Paul Lawrence // Get path of folder. Must create before using any properties 22bc2eb8c3fd621605ff1ccaed04a71e6685acc974Paul Lawrence // This is to allow proper setting of SELinux policy 23bc2eb8c3fd621605ff1ccaed04a71e6685acc974Paul Lawrence static std::string GetPath(const char* device); 24bc2eb8c3fd621605ff1ccaed04a71e6685acc974Paul Lawrence 2561980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence // Opens properties folder on named device. 26bc2eb8c3fd621605ff1ccaed04a71e6685acc974Paul Lawrence // If folder does not exist, OK will return false, all 2761980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence // getters will return default properties and setters will fail. 2861980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence UnencryptedProperties(const char* device); 2961980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence 3061980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence // Get named object. Return default if object does not exist or error. 31bc2eb8c3fd621605ff1ccaed04a71e6685acc974Paul Lawrence template<typename t> t Get(const char* name, t default_value = t()) const; 3261980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence 3361980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence // Set named object. Return true if success, false otherwise 3461980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence template<typename t> bool Set(const char* name, t const& value); 3561980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence 3661980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence // Get child properties 37bc2eb8c3fd621605ff1ccaed04a71e6685acc974Paul Lawrence UnencryptedProperties GetChild(const char* name) const; 3861980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence 3961980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence // Remove named object 4061980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence bool Remove(const char* name); 4161980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence 42bc2eb8c3fd621605ff1ccaed04a71e6685acc974Paul Lawrence // Does folder exist? 43bc2eb8c3fd621605ff1ccaed04a71e6685acc974Paul Lawrence bool OK() const; 44bc2eb8c3fd621605ff1ccaed04a71e6685acc974Paul Lawrence 4561980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrenceprivate: 4661980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence UnencryptedProperties(); 4761980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence std::string folder_; 4861980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence}; 4961980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence 5061980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence 5161980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrencetemplate<typename t> t UnencryptedProperties::Get(const char* name, 52bc2eb8c3fd621605ff1ccaed04a71e6685acc974Paul Lawrence t default_value) const 5361980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence{ 5461980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence if (!OK()) return default_value; 5561980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence t value = default_value; 5661980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence std::ifstream(folder_ + "/" + name) >> value; 5761980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence return value; 5861980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence} 5961980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence 6061980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrencetemplate<typename t> bool UnencryptedProperties::Set(const char* name, 6161980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence t const& value) 6261980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence{ 6361980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence if (!OK()) return false; 6461980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence std::ofstream o(folder_ + "/" + name); 6561980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence o << value; 6661980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence return !o.fail(); 6761980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence} 6861980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence 6961980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence// Specialized getters/setters for strings 7061980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrencetemplate<> std::string UnencryptedProperties::Get(const char* name, 71bc2eb8c3fd621605ff1ccaed04a71e6685acc974Paul Lawrence std::string default_value) const; 7261980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence 7361980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrencetemplate<> bool UnencryptedProperties::Set(const char* name, 7461980269c14ae78a9ca893a56df67cf475cdfafdPaul Lawrence std::string const& value); 75