/*
* Copyright (c) Likewise Software. All rights Reserved.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the license, or (at
* your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
* General Public License for more details. You should have received a copy
* of the GNU Lesser General Public License along with this program. If
* not, see .
*
* LIKEWISE SOFTWARE MAKES THIS SOFTWARE AVAILABLE UNDER OTHER LICENSING
* TERMS AS WELL. IF YOU HAVE ENTERED INTO A SEPARATE LICENSE AGREEMENT
* WITH LIKEWISE SOFTWARE, THEN YOU MAY ELECT TO USE THE SOFTWARE UNDER THE
* TERMS OF THAT SOFTWARE LICENSE AGREEMENT INSTEAD OF THE TERMS OF THE GNU
* LESSER GENERAL PUBLIC LICENSE, NOTWITHSTANDING THE ABOVE NOTICE. IF YOU
* HAVE QUESTIONS, OR WISH TO REQUEST A COPY OF THE ALTERNATE LICENSING
* TERMS OFFERED BY LIKEWISE SOFTWARE, PLEASE CONTACT LIKEWISE SOFTWARE AT
* license@likewisesoftware.com
*/
/*
* Module Name:
*
* security-private.h
*
* Abstract:
*
* Security token API (private header)
*
* Authors: Brian Koropoff (bkoropoff@likewisesoftware.com)
*
*/
#ifndef __LWMSG_SECURITY_PRIVATE_H__
#define __LWMSG_SECURITY_PRIVATE_H__
#include
typedef struct LWMsgSecurityTokenClass
{
/** The size of the private data structure used by the implementation */
size_t private_size;
/**
* @ingroup security_impl
* @brief Construct method
*
* Performs basic construction of a new security token.
*
* @param token the token object
* @lwmsg_status
* @lwmsg_success
* @lwmsg_memory
* @lwmsg_endstatus
*/
LWMsgStatus (*construct)(LWMsgSecurityToken* token);
/**
* @ingroup security_impl
* @brief Destruct method
*
* Frees all resources allocated by the construct method.
*
* @param token the token object
*/
void (*destruct)(LWMsgSecurityToken* token);
/**
* @ingroup security_impl
* @brief Query token type method
*
* Returns the string constant which identifies the
* type of the security token.
* @param token the token object
* @return the string constant identifier
*/
const char* (*get_type)(LWMsgSecurityToken* token);
/**
* @ingroup security_impl
* @brief Compare token method
*
* Compares two security tokens for equality
*
* @param token the token on which the method was dispatched
* @param other the other security token
* @retval #LWMSG_TRUE if the tokens are equal
* @retval #LWMSG_FALSE if the tokens are not equal
*/
LWMsgBool (*equal)(LWMsgSecurityToken* token, LWMsgSecurityToken* other);
/**
* @ingroup security_impl
* @brief Test access permission method
*
* Tests if the security token other is allowed to
* access resources owned by the security token token.
* This method must return #LWMSG_TRUE in all cases where
* the equal method would do so.
*
* @param token the token on which the method was dispatched
* @param other the other security token
* @retval #LWMSG_TRUE other can access resources owned by token
* @retval #LWMSG_FALSE other cannot access resources owned by token
*/
LWMsgBool (*can_access)(LWMsgSecurityToken* token, LWMsgSecurityToken* other);
/**
* @ingroup security_impl
* @brief Copy method
*
* Creates an identical copy of the security token. In particular,
* the following invariants must be satisfied after the method completes:
*
* - token != *out_token
* - lwmsg_security_token_equal(token, *out_token) == LWMSG_TRUE
*
* @param[in] token the token object
* @param[out] out_token the copy
* @lwmsg_status
* @lwmsg_success
* @lwmsg_memory
* @lwmsg_endstatus
*/
LWMsgStatus (*copy)(LWMsgSecurityToken* token, LWMsgSecurityToken** out_token);
/**
* @ingroup security_impl
* @brief Hash method
*
* Returns a hash code for a security token. A good implementation of this
* method is important for client applications which may want to perform
* efficient lookups into a data structure with a security token key.
*
* The following invariants must be satisfied for any two tokens a
* and b.
*
* - If equal(a, b) == LWMSG_TRUE, then hash(a) == hash(b)
* - If hash(a) != hash(b), then equal(a,b) == LWMSG_FALSE
* @param token the token object
* @return a hash code
*/
size_t (*hash)(LWMsgSecurityToken* token);
} LWMsgSecurityTokenClass;
/**
* @ingroup security_impl
* @brief Instantiate security token
*
* Creates a new security token of the specified class and
* calls the constructor. This function should generally
* not be used by client applications directly.
*
* @param[in] tclass the token class structure
* @param[out] token the created token
* @lwmsg_status
* @lwmsg_success
* @lwmsg_memory
* @lwmsg_endstatus
*/
LWMsgStatus
lwmsg_security_token_new(
LWMsgSecurityTokenClass* tclass,
LWMsgSecurityToken** token
);
/**
* @ingroup security_impl
* @brief Access private data
*
* Gets the private data structure for the specified
* token. This function should generally not be used
* by client applications directly.
*
* @param[in] token the token object
* @return a pointer to the private data structure
*/
void*
lwmsg_security_token_get_private(
LWMsgSecurityToken* token
);
struct LWMsgSecurityToken
{
LWMsgSecurityTokenClass* tclass;
unsigned char private_data[];
};
#endif