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