/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



#include "precompiled_xmlsecurity.hxx"
#include <certificatecontainer.hxx>
 
#include <sal/config.h>

using namespace ::com::sun::star::uno;


sal_Bool 
CertificateContainer::searchMap( const ::rtl::OUString & url, const ::rtl::OUString & certificate_name, Map &_certMap )
{
	Map::iterator p = _certMap.find(url);

	::sal_Bool ret = sal_False;

	while( p != _certMap.end() )
	{
		ret = (sal_Bool) (*p).second.equals(certificate_name);
		if( ret ) 
                    break;
		p++;
	}

	return ret;
}
// -------------------------------------------------------------------

sal_Bool 
CertificateContainer::isTemporaryCertificate ( const ::rtl::OUString & url, const ::rtl::OUString & certificate_name )
    throw(::com::sun::star::uno::RuntimeException)
{
	return searchMap( url, certificate_name, certMap);
}

// -------------------------------------------------------------------

sal_Bool 
CertificateContainer::isCertificateTrust ( const ::rtl::OUString & url, const ::rtl::OUString & certificate_name )
    throw(::com::sun::star::uno::RuntimeException)
{
	return searchMap( url, certificate_name, certTrustMap);
}

// -------------------------------------------------------------------
sal_Bool 
CertificateContainer::addCertificate( const ::rtl::OUString & url, const ::rtl::OUString & certificate_name, ::sal_Bool trust )
    throw(::com::sun::star::uno::RuntimeException)
{
	certMap.insert( Map::value_type( url, certificate_name ) );
        
        //remember that the cert is trusted
        if (trust)
            certTrustMap.insert( Map::value_type( url, certificate_name ) );
        
        return true;
}

//-------------------------------------------------------------------------
::security::CertificateContainerStatus 
CertificateContainer::hasCertificate( const ::rtl::OUString & url, const ::rtl::OUString & certificate_name ) throw(::com::sun::star::uno::RuntimeException)
{
	if ( isTemporaryCertificate( url, certificate_name ) )
	{
		if ( isCertificateTrust( url, certificate_name ) )
			return security::CertificateContainerStatus( security::CertificateContainerStatus_TRUSTED );
		else
			return security::CertificateContainerStatus_UNTRUSTED;
	} else
	{
		return security::CertificateContainerStatus_NOCERT;
	}
}
//-------------------------------------------------------------------------

::rtl::OUString SAL_CALL 
CertificateContainer::getImplementationName( ) 
    throw(::com::sun::star::uno::RuntimeException)
{
    return impl_getStaticImplementationName();
}

//-------------------------------------------------------------------------

sal_Bool SAL_CALL 
CertificateContainer::supportsService( const ::rtl::OUString& ServiceName ) 
    throw(::com::sun::star::uno::RuntimeException)
{
    if ( ServiceName.compareToAscii("com.sun.star.security.CertificateContainer") == 0 )
        return sal_True;
    else
        return sal_False;
}

//-------------------------------------------------------------------------

Sequence< ::rtl::OUString > SAL_CALL 
CertificateContainer::getSupportedServiceNames(  ) 
    throw(::com::sun::star::uno::RuntimeException)
{
	return impl_getStaticSupportedServiceNames();
}

//-------------------------------------------------------------------------

Sequence< ::rtl::OUString > SAL_CALL 
CertificateContainer::impl_getStaticSupportedServiceNames(  ) 
    throw(::com::sun::star::uno::RuntimeException)
{
    Sequence< ::rtl::OUString > aRet(1);
    *aRet.getArray() = ::rtl::OUString::createFromAscii("com.sun.star.security.CertificateContainer");
    return aRet;
}

//-------------------------------------------------------------------------

::rtl::OUString SAL_CALL 
CertificateContainer::impl_getStaticImplementationName() 
    throw(::com::sun::star::uno::RuntimeException)
{
    return ::rtl::OUString::createFromAscii("com.sun.star.security.CertificateContainer");
}

//-------------------------------------------------------------------------

Reference< XInterface > SAL_CALL CertificateContainer::impl_createInstance( const Reference< XMultiServiceFactory >& xServiceManager ) 
    throw( RuntimeException )
{
	return Reference< XInterface >( *new CertificateContainer( xServiceManager ) );
}

//-------------------------------------------------------------------------

Reference< XSingleServiceFactory > SAL_CALL 
CertificateContainer::impl_createFactory( const Reference< XMultiServiceFactory >& ServiceManager ) 
    throw(RuntimeException)
{
	Reference< XSingleServiceFactory > xReturn( ::cppu::createOneInstanceFactory( ServiceManager, 
		CertificateContainer::impl_getStaticImplementationName(),
		CertificateContainer::impl_createInstance,
		CertificateContainer::impl_getStaticSupportedServiceNames()));

	return xReturn;		
}

