#ifndef __SEC_ENTITYATTR_H__
#define __SEC_ENTITYATTR_H__
/******************************************************************************/
/* */
/* X r d S e c E n t i t y A t t r . h h */
/* */
/* (c) 2019 by the Board of Trustees of the Leland Stanford, Jr., University */
/* Produced by Andrew Hanushevsky for Stanford University under contract */
/* DE-AC02-76-SFO0515 with the Department of Energy */
/* */
/* This file is part of the XRootD software suite. */
/* */
/* XRootD 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 3 of the License, or (at your */
/* option) any later version. */
/* */
/* XRootD 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 XRootD in a file called COPYING.LESSER (LGPL license) and file */
/* COPYING (GPL license). If not, see . */
/* */
/* The copyright holder's institutional names and contributor's names may not */
/* be used to endorse or promote products derived from this software without */
/* specific prior written permission of the institution or contributor. */
/******************************************************************************/
//------------------------------------------------------------------------------
//! This object is a non-const extension of the XrdSecEntity object. It is
//! used as the interface to XrdSecEntity attributes. Normally, a const
//! pointer is used for the XrdSecEntity object as nothing changes in the
//! entity. However, attributes may be added and deleted from the entity
//! changing the logical view of the entity. This provides a non-const
//! mechanism to this without the need to recast the XrdSecEntity pointer.
//------------------------------------------------------------------------------
#include
#include
#include
class XrdSecAttr;
class XrdSecEntityAttrCB;
class XrdSecEntityXtra;
/******************************************************************************/
/* X r d S e c E n t i t y A t t r */
/******************************************************************************/
class XrdSecEntityAttr
{
public:
friend class XrdSecEntity;
//------------------------------------------------------------------------------
//! Add an attribute object to this entity.
//!
//! @param attr - Reference to the attribute object.
//!
//! @return True, the object was added.
//! @return False, the object was not added because such an object exists.
//------------------------------------------------------------------------------
bool Add(XrdSecAttr &attr);
//------------------------------------------------------------------------------
//! Add a key-value attribute to this entity. If one exists it is replaced.
//!
//! @param key - Reference to the key.
//! @param val - Reference to the value.
//! @param replace - When true, any existing key-value is replaced. Otherwise,
//! the add is not performed.
//!
//! @return True, the key-value was added or replaced.
//! @return False, the key already exists so he value was not added.
//------------------------------------------------------------------------------
bool Add(const std::string &key,
const std::string &val, bool replace=false);
//------------------------------------------------------------------------------
//! Get an attribute object associated with this entity.
//!
//! @param sigkey - A unique attribute object signature key.
//!
//! @return Upon success a pointer to the attribute object is returned.
//! Otherwise, a nil pointer is returned.
//------------------------------------------------------------------------------
XrdSecAttr *Get(const void *sigkey);
//------------------------------------------------------------------------------
//! Get an attribute key value associated with this entity.
//!
//! @param key - The reference to the key.
//! @param val - The reference to the string object to receive the value.
//!
//! @return Upon success true is returned. If the key does not exist, false
//! is returned and the val object remains unchanged.
//------------------------------------------------------------------------------
bool Get(const std::string &key, std::string &val);
//------------------------------------------------------------------------------
//! Get all the keys for associated attribytes.
//!
//! @return A vector containing all of the keys.
//------------------------------------------------------------------------------
std::vector Keys();
//------------------------------------------------------------------------------
//! List key-value pairs via iterative callback on passed ovject.
//!
//! @param attrCB - Reference to the callback object to receive list entries.
//------------------------------------------------------------------------------
void List(XrdSecEntityAttrCB &attrCB);
//------------------------------------------------------------------------------
//! Constructor and Destructor.
//!
//! @param xtra - Pointer to the data for the implementation.
//------------------------------------------------------------------------------
XrdSecEntityAttr(XrdSecEntityXtra *xtra) : entXtra(xtra) {}
~XrdSecEntityAttr() {}
private:
XrdSecEntityXtra *entXtra;
};
/******************************************************************************/
/* X r d S e c E n t i t y A t t r C B */
/******************************************************************************/
// The XrdSecEntityAttrCB class defines the callback object passed to the
// XrdSecEntity::List() method to iteratively obtain the key-value attribute
// pairs associated with the entity. The XrdSecEntityAttrCB::Attr() method is
// called for each key-value pair. The end of the list is indicated by calling
// Attr() with nil key-value pointers. The Attr() method should not call
// the XrdSecEntity::Add() or XrdSecEntity::Get() methods; otherwise, a
// deadlock will occur.
//
class XrdSecEntityAttrCB
{
public:
//------------------------------------------------------------------------------
//! Acceppt a key-value attribute pair from the XrdSecEntity::List() method.
//!
//! @param key - The key, if nil this is the end of the list.
//! @param val - The associated value, if nil this is the end of the list.
//!
//! @return One of the Action enum values. The return value is ignored when
//! the end of the list indicator is returned.
//------------------------------------------------------------------------------
enum Action {Delete = -1, //!< Delete the key-value and proceed to next one
Stop = 0, //!< Stop the iteration
Next = 1 //!< Proceed to the next key-value pair
};
virtual Action Attr(const char *key, const char *val) = 0;
//------------------------------------------------------------------------------
//! Constructor and Destructor.
//------------------------------------------------------------------------------
XrdSecEntityAttrCB() {}
virtual ~XrdSecEntityAttrCB() {}
};
#endif