///////////////////////////////////////////////////////////////////////////////
// Copyright (c) Winnov L.P., 1996.  All rights reserved
// security.cpp: CSecurity class implementation.
///////////////////////////////////////////////////////////////////////////////

#include <windows.h>
#include <malloc.h>
#include "debug.h"
#include "security.h"

///////////////////////////////////////////////////////////////////////////////

void securityConstructor (PSECURITY pSecurity)
{
    pSecurity->m_pSD = NULL;
}

void securityDestructor (PSECURITY pSecurity) {} // destructor stub

///////////////////////////////////////////////////////////////////////////////

PSECURITY_ATTRIBUTES securityGetSecurityAttributes (PSECURITY pSecurity)
{
    return &pSecurity->m_sa;
}

///////////////////////////////////////////////////////////////////////////////

void securityClose (PSECURITY pSecurity)
{
    if (pSecurity->m_pSD)
    {
	free ((PVOID)pSecurity->m_pSD);
	pSecurity->m_pSD = NULL;
    }
}

///////////////////////////////////////////////////////////////////////////////

DWORD securityOpen (PSECURITY pSecurity)
{
    DWORD dwResult;

    // create a security descriptor that allows anyone to write
    pSecurity->m_pSD = (PSECURITY_DESCRIPTOR) malloc (SECURITY_DESCRIPTOR_MIN_LENGTH);
    if (!pSecurity->m_pSD)
    {
	TraceString ("\n********** securityOpen: malloc failed.");
	securityClose (pSecurity);
	return ERROR_NOT_ENOUGH_MEMORY;
    }

    if (!InitializeSecurityDescriptor(pSecurity->m_pSD, SECURITY_DESCRIPTOR_REVISION))
    {
	dwResult = GetLastError ();
	TraceString ("\n********** securityOpen: InitializeSecurityDescriptor failed");
	securityClose (pSecurity);
	return dwResult;
    }

    // add a NULL disc. ACL to the security descriptor.
    //
    if (!SetSecurityDescriptorDacl (pSecurity->m_pSD, TRUE, (PACL) NULL, FALSE))
    {
	dwResult = GetLastError ();
	TraceString ("\n********** securityOpen: SetSecurityDescriptorDacl failed");
	securityClose (pSecurity);
	return dwResult;
    }

    pSecurity->m_sa.nLength = sizeof(pSecurity->m_sa);
    pSecurity->m_sa.lpSecurityDescriptor = pSecurity->m_pSD;
    pSecurity->m_sa.bInheritHandle = TRUE;

    return 0;	// pass
}
