This change is needed as USD exits if no communication is processed.
As for now, all the policy was stored in USD process memory.
Now it is necassary to save it.
As for now store the policy in /run/usb-security-daemon.
This will cause reset of policy after each device reset.
Change-Id: Id8c8c5e00944f3530333a7410bda0250681d8baf
Signed-off-by: Stanislaw Wadas <s.wadas@samsung.com>
Signed-off-by: Jan Cybulski <j.cybulski@samsung.com>
}
}
+USBDevicePath::USBDevicePath(std::string min, std::string maj, std::string m_sysPath)
+ : m_sysPath(m_sysPath)
+{
+ int t_maj, t_min;
+ std::stringstream s_maj, s_min;
+
+ s_maj << std::hex << maj;
+ s_min << std::hex << min;
+ s_maj >> t_maj;
+ s_min >> t_min;
+
+ m_dev = makedev(t_min, t_maj);
+}
+
const std::string &USBDevicePath::getSysFSPath() const
{
return m_sysPath;
const USBDevicePath &path)
{
- stream << '(' << major(path.m_dev) << ':' << minor(path.m_dev) << ", "
- << path.m_sysPath << ')';
+ stream << major(path.m_dev) << ';' << minor(path.m_dev) << ";"
+ << path.m_sysPath << ";";
return stream;
}
initDevId(m_path.getSysFSPath());
}
+USBDeviceId::USBDeviceId(std::string values[], USBDevicePath m_path)
+ : m_path(m_path)
+{
+ std::stringstream ssVal[7];
+ int decVal[7];
+ int i;
+ for (i = 0; i < 7; i++){
+ ssVal[i] << values[i+1];
+ ssVal[i] >> std::hex >> decVal[i];
+ }
+
+ m_idVendor = decVal[0];
+ m_idProduct = decVal[1];
+ m_bcdDevice = decVal[2];
+ m_bDeviceClass = decVal[3];
+ m_bDeviceSubClass = decVal[4];
+ m_bDeviceProtocol = decVal[5];
+ m_bcdUSB = decVal[6];
+
+}
+
USBDeviceId::USBDeviceId(const USBDevicePath &path)
: m_path(path)
{
#undef NAMED_VAL
int i = 0;
- stream << "(";
for (i = 0; (unsigned)i < ARRAY_SIZE(fields); ++i)
- stream << fields[i].name << ": " << std::hex << fields[i].val << ", ";
+ stream << ";" << std::hex << fields[i].val;
- stream << "devicePath: " << id.m_path;
+ stream << ";" << id.m_path;
- stream << ")";
return stream;
}
std::ostream& operator<<(std::ostream& stream,
const USBAccessMapKey& key)
{
- stream << "(" << key.m_subject << ", " << key.m_device << ")";
+ stream << key.m_subject << key.m_device;
return stream;
}
/* Never call this constructor with SysFS path received from user! */
USBDevicePath(const std::string &path, PathType path_type);
+ USBDevicePath(const std::string min, const std::string maj, std::string m_sysPath);
const std::string &getSysFSPath() const;
const std::string &getTopology() const;
dev_t getDev() const;
{
public:
USBDeviceId(const USBDevicePath &path);
+ USBDeviceId(std::string values[], USBDevicePath m_path);
USBDeviceId(const std::string &path, USBDevicePath::PathType path_type);
bool operator<(const USBDeviceId &r) const;
public:
USBAccessMapKey(const PolicySubjectId &subject,
const USBDeviceId &device);
- bool validate(void) const;
+ bool validate(void) const;
bool operator<(const USBAccessMapKey &r) const;
bool operator==(const USBAccessMapKey &r) const;
friend std::ostream& operator<<(std::ostream& stream,
- const USBAccessMapKey& key);
+ const USBAccessMapKey &key);
const char* getDeviceTopology() const {return m_device.getTopology();}
const char* getAppData() const {return m_subject.getAppData();}
#include <usb-access-map.h>
#include <dbus-manager.h>
#include <cstdint>
+#include <usb-access.h>
namespace USD {
if (valid) {
std::lock_guard<std::mutex> lock(m_eventWriteDBMutex);
m_accessMap[mk] = policy;
+ storePolicy();
retCode = USD_API_SUCCESS;
} else {
retCode = USD_API_ERROR_ACCESS_DENIED;
extern USBAccessMap m_accessMap;
-class USBAddPermission
+class USBAddPermission :
+ public USD::USBAccessService
+
{
public:
#include <dbus-manager.h>
#include <add-permission.h>
+#include <iostream>
+#include <fstream>
+
namespace {
// Service may open more than one socket.
// These ID's will be assigned to sockets
return true;
}
+bool USBAccessService::storePolicy(void) {
+ std::ofstream myfile;
+ myfile.open(POLICY_FILE_PATH);
+ for(auto it = m_accessMap.begin(); it != m_accessMap.end(); it++) {
+ // it->first is map key
+ // it->second is map value (policy at key)
+ myfile << it->first << " " << it->second << " \n";
+ }
+ myfile.close();
+ return true;
+}
+
+bool USBAccessService::restorePolicy(void) {
+ LogDebug("Restoring policy from file" << POLICY_FILE_PATH);
+ std::ifstream file (POLICY_FILE_PATH);
+ std::string line;
+ if (file.is_open())
+ {
+ LogDebug("Policy file found");
+
+ while (std::getline(file, line)) {
+
+ std::stringstream ss(line);
+ std::string item;
+ int i = 0;
+ std::string values[12];
+
+ while (std::getline(ss, item, ';'))
+ {
+ values[i++] = item;
+ }
+
+ PolicySubjectId sub_id(values[0]);
+
+ USBDevicePath m_path(values[8], values[9], values[10]);
+
+ USBDeviceId devId(values, m_path);
+
+ USBAccessMapKey key(sub_id, devId);
+
+ bool policy = atoll(values[11].c_str());
+
+ m_accessMap[key] = policy;
+
+ LogDebug("key: " << key << " policy: " << policy);
+
+ }
+
+ file.close();
+ return true;
+ }
+ LogDebug("No policy file found");
+ return false;
+}
+
bool USBAccessService::processSetupPolicy(const ConnectionID &conn,
MessageBuffer &buffer)
{
if (valid) {
std::lock_guard<std::mutex> lock(m_eventWriteDBMutex);
m_accessMap[mk] = policy;
+ storePolicy();
retCode = USD_API_SUCCESS;
} else {
retCode = USD_API_ERROR_ACCESS_DENIED;
{
public:
typedef std::map<int, MessageBuffer> MessageBufferMap;
+ const std::string POLICY_FILE_PATH = "/run/usb-security-daemon/usdpolicy";
ServiceDescriptionVector GetServiceDescription();
+ USBAccessService() {restorePolicy();};
+ bool storePolicy(void);
+
DECLARE_THREAD_EVENT(AcceptEvent, accept)
DECLARE_THREAD_EVENT(WriteEvent, write)
DECLARE_THREAD_EVENT(ReadEvent, process)
void close(const CloseEvent &event);
private:
+ bool restorePolicy(void);
bool processOne(const ConnectionID &conn, MessageBuffer &buffer);
bool processOpen(const ConnectionID &conn, MessageBuffer &buffer);
bool processSetupPolicy(const ConnectionID &conn, MessageBuffer &buffer);
%install
rm -rf %{buildroot}
mkdir -p %{buildroot}%{_datadir}/license
+mkdir -p %{buildroot}/usr/lib/tmpfiles.d
cp LICENSE %{buildroot}%{_datadir}/license/%{name}
cp LICENSE %{buildroot}%{_datadir}/license/libusd-client
+cp usb-security-daemon.conf %{buildroot}/usr/lib/tmpfiles.d
mkdir -p %{buildroot}%{_sysconfdir}/security/
%make_install
%attr(-,root,root) %{_unitdir}/sockets.target.wants/usd-ask-user.socket
%attr(-,root,root) %{_unitdir}/usd-access.socket
%attr(-,root,root) %{_unitdir}/usd-ask-user.socket
+%attr(-,root,root) /usr/lib/tmpfiles.d/usb-security-daemon.conf
%{_datadir}/license/%{name}
%files libusd-client
--- /dev/null
+d /run/usb-security-daemon 1755 root root 10d