(file) Return to CIMOperationRequestAuthorizer.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Server

File: [Pegasus] / pegasus / src / Pegasus / Server / CIMOperationRequestAuthorizer.cpp (download)
Revision: 1.2, Tue Jan 15 16:49:39 2002 UTC (22 years, 5 months ago) by sage
Branch: MAIN
CVS Tags: pre-meta-dispatcher, VERSION_1_07
Changes since 1.1: +1 -0 lines
added #include <Pegasus/Common/Config.h> to fix Linux build

//%/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000, 2001 BMC Software, Hewlett-Packard Company, IBM,
// The Open Group, Tivoli Systems
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
//==============================================================================
//
// Author:  Nag Boranna, Hewlett-Packard Company (nagaraja_boranna@hp.com)
//
// Modified By:
//
//%/////////////////////////////////////////////////////////////////////////////

#include <Pegasus/Common/Config.h>
#include <Pegasus/Security/UserManager/UserManager.h>
#include <Pegasus/Common/HTTPMessage.h>
#include <Pegasus/Common/Destroyer.h>
#include <Pegasus/Common/XmlWriter.h>
#include <Pegasus/Common/Tracer.h>
#include "CIMOperationRequestAuthorizer.h"

PEGASUS_NAMESPACE_BEGIN

PEGASUS_USING_STD;


CIMOperationRequestAuthorizer::CIMOperationRequestAuthorizer(
    MessageQueue* outputQueue)
    :
    _outputQueue(outputQueue),
    _serverTerminating(false)
{
    const char METHOD_NAME[] = 
        "CIMOperationRequestAuthorizer::CIMOperationRequestAuthorizer()";

    PEG_FUNC_ENTER(TRC_SERVER, METHOD_NAME);

    PEG_FUNC_EXIT(TRC_SERVER, METHOD_NAME);
}

CIMOperationRequestAuthorizer::~CIMOperationRequestAuthorizer()
{
    const char METHOD_NAME[] = 
        "CIMOperationRequestAuthorizer::~CIMOperationRequestAuthorizer()";

    PEG_FUNC_ENTER(TRC_SERVER, METHOD_NAME);

    PEG_FUNC_EXIT(TRC_SERVER, METHOD_NAME);
}

void CIMOperationRequestAuthorizer::sendResponse(
    Uint32 queueId,
    Array<Sint8>& message)
{
    const char METHOD_NAME[] = 
        "CIMOperationRequestAuthorizer::sendResponse()";

    PEG_FUNC_ENTER(TRC_SERVER, METHOD_NAME);

    MessageQueue* queue = MessageQueue::lookup(queueId);

    if (queue)
    {
        HTTPMessage* httpMessage = new HTTPMessage(message);
        queue->enqueue(httpMessage);
    }
    PEG_FUNC_EXIT(TRC_SERVER, METHOD_NAME);
}

void CIMOperationRequestAuthorizer::sendError(
    Uint32 queueId,
    const String& messageId,
    const String& cimMethodName,
    CIMStatusCode code,
    const String& description)
{
    const char METHOD_NAME[] = 
        "CIMOperationRequestAuthorizer::sendError()";

    PEG_FUNC_ENTER(TRC_SERVER, METHOD_NAME);

    ArrayDestroyer<char> tmp1(cimMethodName.allocateCString());
    ArrayDestroyer<char> tmp2(description.allocateCString());

    Array<Sint8> message = XmlWriter::formatMethodResponseHeader(
        XmlWriter::formatMessageElement(
            messageId,
            XmlWriter::formatSimpleRspElement(
                XmlWriter::formatIMethodResponseElement(
                    tmp1.getPointer(),
                    XmlWriter::formatErrorElement(code, tmp2.getPointer())))));

    sendResponse(queueId, message);

    PEG_FUNC_EXIT(TRC_SERVER, METHOD_NAME);
}

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

void CIMOperationRequestAuthorizer::handleEnqueue()
{
    const char METHOD_NAME[] = 
        "CIMOperationRequestAuthorizer::handleEnqueue()";

    PEG_FUNC_ENTER(TRC_SERVER, METHOD_NAME);

    Message* request = dequeue();

    if (!request)
    {
        PEG_FUNC_EXIT(TRC_SERVER, METHOD_NAME);
	return;
    }

    //
    // Get the HTTPConnection queue id
    //
    QueueIdStack qis = ((CIMRequestMessage*)request)->queueIds.copyAndPop();

    Uint32 queueId = qis.top();


    String userName = String::EMPTY;

    String nameSpace = String::EMPTY;

    String cimMethodName = String::EMPTY;

    switch (request->getType())
    {
        case CIM_GET_CLASS_REQUEST_MESSAGE:
            userName = ((CIMGetClassRequestMessage*)request)->userName;
            nameSpace = ((CIMGetClassRequestMessage*)request)->nameSpace;
            cimMethodName = "GetClass";
            break;

        case CIM_GET_INSTANCE_REQUEST_MESSAGE:
            userName = ((CIMGetInstanceRequestMessage*)request)->userName;
            nameSpace = ((CIMGetInstanceRequestMessage*)request)->nameSpace;
            cimMethodName = "GetInstance";
            break;

        case CIM_DELETE_CLASS_REQUEST_MESSAGE:
            userName = ((CIMDeleteClassRequestMessage*)request)->userName;
            nameSpace = ((CIMDeleteClassRequestMessage*)request)->nameSpace;
            cimMethodName = "DeleteClass";
            break;

        case CIM_DELETE_INSTANCE_REQUEST_MESSAGE:
            userName = ((CIMDeleteInstanceRequestMessage*)request)->userName;
            nameSpace = ((CIMDeleteInstanceRequestMessage*)request)->nameSpace;
            cimMethodName = "DeleteInstance";
            break;

        case CIM_CREATE_CLASS_REQUEST_MESSAGE:
            userName = ((CIMCreateClassRequestMessage*)request)->userName;
            nameSpace = ((CIMCreateClassRequestMessage*)request)->nameSpace;
            cimMethodName = "CreateClass";
            break;

        case CIM_CREATE_INSTANCE_REQUEST_MESSAGE:
            userName = ((CIMCreateInstanceRequestMessage*)request)->userName;
            nameSpace = ((CIMCreateInstanceRequestMessage*)request)->nameSpace;
            cimMethodName = "CreateInstance";
            break;

        case CIM_MODIFY_CLASS_REQUEST_MESSAGE:
            userName = ((CIMModifyClassRequestMessage*)request)->userName;
            nameSpace = ((CIMModifyClassRequestMessage*)request)->nameSpace;
            cimMethodName = "ModifyClass";
            break;

        case CIM_MODIFY_INSTANCE_REQUEST_MESSAGE:
            userName = ((CIMModifyInstanceRequestMessage*)request)->userName;
            nameSpace = ((CIMModifyInstanceRequestMessage*)request)->nameSpace;
            cimMethodName = "ModifyInstance";
            break;

        case CIM_ENUMERATE_CLASSES_REQUEST_MESSAGE:
            userName = ((CIMEnumerateClassesRequestMessage*)request)->userName;
            nameSpace = ((CIMEnumerateClassesRequestMessage*)request)->nameSpace;
            cimMethodName = "EnumerateClasses";
            break;

        case CIM_ENUMERATE_CLASS_NAMES_REQUEST_MESSAGE:
            userName = ((CIMEnumerateClassNamesRequestMessage*)request)->userName;
            nameSpace = ((CIMEnumerateClassNamesRequestMessage*)request)->nameSpace;
            cimMethodName = "EnumerateClassNames";
            break;

        case CIM_ENUMERATE_INSTANCES_REQUEST_MESSAGE:
            userName = ((CIMEnumerateInstancesRequestMessage*)request)->userName;
            nameSpace = ((CIMEnumerateInstancesRequestMessage*)request)->nameSpace;
            cimMethodName = "EnumerateInstances";
            break;

        case CIM_ENUMERATE_INSTANCE_NAMES_REQUEST_MESSAGE:
            userName = ((CIMEnumerateInstanceNamesRequestMessage*)request)->userName;
            nameSpace = ((CIMEnumerateInstanceNamesRequestMessage*)request)->nameSpace;
            cimMethodName = "EnumerateInstanceNames";
            break;

        //ATTN: Implement this when ExecQuery is implemented in the decoder
        case CIM_EXEC_QUERY_REQUEST_MESSAGE:
            //userName = ((CIMExecQueryRequestMessage*)request)->userName;
            //nameSpace = ((CIMExecQueryRequestMessage*)request)->nameSpace;
            //cimMethodName = "ExecQuery";
            break;

        case CIM_ASSOCIATORS_REQUEST_MESSAGE:
            userName = ((CIMAssociatorsRequestMessage*)request)->userName;
            nameSpace = ((CIMAssociatorsRequestMessage*)request)->nameSpace;
            cimMethodName = "Associators";
            break;

        case CIM_ASSOCIATOR_NAMES_REQUEST_MESSAGE:
            userName = ((CIMAssociatorNamesRequestMessage*)request)->userName;
            nameSpace = ((CIMAssociatorNamesRequestMessage*)request)->nameSpace;
            cimMethodName = "AssociatorNames";
            break;

        case CIM_REFERENCES_REQUEST_MESSAGE:
            userName = ((CIMReferencesRequestMessage*)request)->userName;
            nameSpace = ((CIMReferencesRequestMessage*)request)->nameSpace;
            cimMethodName = "References";
            break;

        case CIM_REFERENCE_NAMES_REQUEST_MESSAGE:
            userName = ((CIMReferenceNamesRequestMessage*)request)->userName;
            nameSpace = ((CIMReferenceNamesRequestMessage*)request)->nameSpace;
            cimMethodName = "ReferenceNames";
            break;

        case CIM_GET_PROPERTY_REQUEST_MESSAGE:
            userName = ((CIMGetPropertyRequestMessage*)request)->userName;
            nameSpace = ((CIMGetPropertyRequestMessage*)request)->nameSpace;
            cimMethodName = "GetProperty";
            break;

        case CIM_SET_PROPERTY_REQUEST_MESSAGE:
            userName = ((CIMSetPropertyRequestMessage*)request)->userName;
            nameSpace = ((CIMSetPropertyRequestMessage*)request)->nameSpace;
            cimMethodName = "SetProperty";
            break;

        case CIM_GET_QUALIFIER_REQUEST_MESSAGE:
            userName = ((CIMGetQualifierRequestMessage*)request)->userName;
            nameSpace = ((CIMGetQualifierRequestMessage*)request)->nameSpace;
            cimMethodName = "GetQualifier";
            break;

        case CIM_SET_QUALIFIER_REQUEST_MESSAGE:
            userName = ((CIMSetQualifierRequestMessage*)request)->userName;
            nameSpace = ((CIMSetQualifierRequestMessage*)request)->nameSpace;
            cimMethodName = "SetQualifier";
            break;

        case CIM_DELETE_QUALIFIER_REQUEST_MESSAGE:
            userName = ((CIMDeleteQualifierRequestMessage*)request)->userName;
            nameSpace = ((CIMDeleteQualifierRequestMessage*)request)->nameSpace;
            cimMethodName = "DeleteQualifier";
            break;

        case CIM_ENUMERATE_QUALIFIERS_REQUEST_MESSAGE:
            userName = ((CIMEnumerateQualifiersRequestMessage*)request)->userName;
            nameSpace = ((CIMEnumerateQualifiersRequestMessage*)request)->nameSpace;
            cimMethodName = "EnumerateQualifiers";
            break;

        case CIM_INVOKE_METHOD_REQUEST_MESSAGE:
            userName = ((CIMInvokeMethodRequestMessage*)request)->userName;
            nameSpace = ((CIMInvokeMethodRequestMessage*)request)->nameSpace;
            cimMethodName = "InvokeMethod";
            break;

        case CIM_ENABLE_INDICATION_SUBSCRIPTION_REQUEST_MESSAGE:
            userName = 
                ((CIMEnableIndicationSubscriptionRequestMessage*)request)->userName;
            nameSpace = 
                ((CIMEnableIndicationSubscriptionRequestMessage*)request)->nameSpace;
            cimMethodName = "EnableIndicationSubscription";
            break;

        case CIM_MODIFY_INDICATION_SUBSCRIPTION_REQUEST_MESSAGE:
            userName = 
                ((CIMModifyIndicationSubscriptionRequestMessage*)request)->userName;
            nameSpace = 
                ((CIMModifyIndicationSubscriptionRequestMessage*)request)->nameSpace;
            cimMethodName = "ModifyIndicationSubscription";
            break;

        case CIM_DISABLE_INDICATION_SUBSCRIPTION_REQUEST_MESSAGE:
            userName = 
                ((CIMDisableIndicationSubscriptionRequestMessage*)request)->userName;
            nameSpace = 
                ((CIMDisableIndicationSubscriptionRequestMessage*)request)->nameSpace;
            cimMethodName = "DisableIndicationSubscription";
            break;

        default:
            break;
    }

    //
    // if CIMOM is shutting down, return error response
    //
    // ATTN:  Need to define a new CIM Error.
    //
    if (_serverTerminating)
    {
        String description = "CIMServer is shutting down.  ";
        description.append("Request cannot be processed: ");

        sendError(
            queueId,
            ((CIMRequestMessage*)request)->messageId,
            cimMethodName,
            CIM_ERR_FAILED,
            description);

        PEG_FUNC_EXIT(TRC_SERVER, METHOD_NAME);

        return;
    }

    //
    // Do Authorization verification
    //
    UserManager* userManager = UserManager::getInstance();

    if ( !userManager || !userManager->verifyAuthorization(
        userName, nameSpace, cimMethodName) )
    {
        String description = "Not authorized to run ";
            description.append(cimMethodName);
        description.append(" in the namespace ");
        description.append(nameSpace);

        sendError(
            queueId,
            ((CIMRequestMessage*)request)->messageId,
            cimMethodName,
            CIM_ERR_FAILED,
            description);

        PEG_FUNC_EXIT(TRC_SERVER, METHOD_NAME);

        return;
    }

    //
    // Enqueue the request
    //
    _outputQueue->enqueue(request);

    PEG_FUNC_EXIT(TRC_SERVER, METHOD_NAME);
}

const char* CIMOperationRequestAuthorizer::getQueueName() const
{
    const char METHOD_NAME[] = 
        "CIMOperationRequestAuthorizer::getQueueName()";

    PEG_FUNC_ENTER(TRC_SERVER, METHOD_NAME);

    PEG_FUNC_EXIT(TRC_SERVER, METHOD_NAME);

    return "CIMOperationRequestAuthorizer";
}

void CIMOperationRequestAuthorizer::setServerTerminating(Boolean flag)
{
    const char METHOD_NAME[] = 
        "CIMOperationRequestAuthorizer::setServerTerminating()";

    PEG_FUNC_ENTER(TRC_SERVER, METHOD_NAME);

    _serverTerminating = flag;

    PEG_FUNC_EXIT(TRC_SERVER, METHOD_NAME);
}

PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2