Program Listing for File PSKPipe.cpp

Return to documentation for file (include/global/Crypto/Windows/PSKPipe.cpp)

#include "PSKPipe.hpp"
#include <Windows.h>
namespace PDJE_CRYPTO {

std::string
PSKPipe::GetTokenFromSTDPipe()
{
    HANDLE      stdhandle = GetStdHandle(STD_INPUT_HANDLE);
    char        buf[4096];
    std::string token;

    for (;;) {
        DWORD got = 0;
        BOOL  ok  = ReadFile(stdhandle, buf, sizeof(buf), &got, nullptr);
        if (!ok || got == 0) {
            break;
        }
        token.append(buf, buf + got);
    }
    return token;
}

void *
PSKPipe::Gen()
{
    try {

        SECURITY_ATTRIBUTES sa{ sizeof(SECURITY_ATTRIBUTES), nullptr, TRUE };
        void               *readHandle = nullptr;
        if (!CreatePipe(&readHandle, &writeHandle, &sa, 0)) {
            critlog("failed to create pipe. tokenpipe generate failed.");
            return nullptr;
        }

        SetHandleInformation(writeHandle, HANDLE_FLAG_INHERIT, 0);

        return readHandle;
    } catch (const std::exception &e) {
        critlog("failed to generate token pipe. WHY: ");
        critlog(e.what());
        return nullptr;
    }
}
void
PSKPipe::Send(const std::string &msg)
{
    try {
        DWORD written = 0;
        if (!WriteFile(writeHandle,
                       msg.data(),
                       (DWORD)msg.size(),
                       &written,
                       nullptr)) {
            critlog("failed to write token to pipe.");
        }
        CloseHandle(writeHandle);
        writeHandle = nullptr;
    } catch (const std::exception &e) {
        critlog("failed to Send Token. Why: ");
        critlog(e.what());
    }
}
PSKPipe::~PSKPipe()
{
    if (writeHandle != nullptr) {
        CloseHandle(writeHandle);
    }
}
}; // namespace PDJE_CRYPTO