|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef WINPTY_WINDOWS_SECURITY_H |
|
#define WINPTY_WINDOWS_SECURITY_H |
|
|
|
#include <windows.h> |
|
#include <aclapi.h> |
|
|
|
#include <memory> |
|
#include <string> |
|
#include <tuple> |
|
#include <utility> |
|
|
|
|
|
|
|
struct SidTag { typedef PSID type; }; |
|
struct AclTag { typedef PACL type; }; |
|
struct SecurityDescriptorTag { typedef PSECURITY_DESCRIPTOR type; }; |
|
|
|
template <typename T> |
|
class SecurityItem { |
|
public: |
|
struct Impl { |
|
virtual ~Impl() {} |
|
}; |
|
|
|
private: |
|
typedef typename T::type P; |
|
P m_v; |
|
std::unique_ptr<Impl> m_pimpl; |
|
|
|
public: |
|
P get() const { return m_v; } |
|
operator bool() const { return m_v != nullptr; } |
|
|
|
SecurityItem() : m_v(nullptr) {} |
|
SecurityItem(P v, std::unique_ptr<Impl> &&pimpl) : |
|
m_v(v), m_pimpl(std::move(pimpl)) {} |
|
SecurityItem(SecurityItem &&other) : |
|
m_v(other.m_v), m_pimpl(std::move(other.m_pimpl)) { |
|
other.m_v = nullptr; |
|
} |
|
SecurityItem &operator=(SecurityItem &&other) { |
|
m_v = other.m_v; |
|
other.m_v = nullptr; |
|
m_pimpl = std::move(other.m_pimpl); |
|
return *this; |
|
} |
|
}; |
|
|
|
typedef SecurityItem<SidTag> Sid; |
|
typedef SecurityItem<AclTag> Acl; |
|
typedef SecurityItem<SecurityDescriptorTag> SecurityDescriptor; |
|
|
|
Sid getOwnerSid(); |
|
Sid wellKnownSid( |
|
const wchar_t *debuggingName, |
|
SID_IDENTIFIER_AUTHORITY authority, |
|
BYTE authorityCount, |
|
DWORD subAuthority0=0, |
|
DWORD subAuthority1=0); |
|
Sid builtinAdminsSid(); |
|
Sid localSystemSid(); |
|
Sid everyoneSid(); |
|
|
|
SecurityDescriptor createPipeSecurityDescriptorOwnerFullControl(); |
|
SecurityDescriptor createPipeSecurityDescriptorOwnerFullControlEveryoneWrite(); |
|
SecurityDescriptor getObjectSecurityDescriptor(HANDLE handle); |
|
|
|
std::wstring sidToString(PSID sid); |
|
Sid stringToSid(const std::wstring &str); |
|
SecurityDescriptor stringToSd(const std::wstring &str); |
|
std::wstring sdToString(PSECURITY_DESCRIPTOR sd); |
|
|
|
DWORD rejectRemoteClientsPipeFlag(); |
|
|
|
enum class GetNamedPipeClientProcessId_Result { |
|
Success, |
|
Failure, |
|
UnsupportedOs, |
|
}; |
|
|
|
std::tuple<GetNamedPipeClientProcessId_Result, DWORD, DWORD> |
|
getNamedPipeClientProcessId(HANDLE serverPipe); |
|
|
|
#endif |
|
|