﻿/*
 * Copyright 2004 - $Date: 2008-11-15 23:58:07 +0100 (za, 15 nov 2008) $ by PeopleWare n.v..
 *
 * Licensed 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.
 */

#region Using

using System;
using System.Diagnostics.Contracts;
using System.Threading;

#endregion

namespace PPWCode.Vernacular.Persistence.I.Dao
{
    [ContractClass(typeof(IPPWSecurityContract))]
    public interface IPPWSecurity
    {
        /// <summary>
        /// Checks if the CurrentPrincipal has enough security for Action "securityActionFlag" on Type "type".
        /// </summary>
        bool HasSufficientSecurity(Type type, SecurityActionFlag securityActionFlag);

        /// <summary>
        /// Checks if the CurrentPrincipal has enough security for Action "securityActionFlag" on Type "type".
        /// If not it should throw an exception of type SecurityAccessDeniedException.
        /// </summary>
        void CheckSecurity(Type type, SecurityActionFlag securityActionFlag);
    }

    // ReSharper restore InconsistentNaming
    /// <exclude />
    [ContractClassFor(typeof(IPPWSecurity))]
    public abstract class IPPWSecurityContract :
        IPPWSecurity
    {
        #region IPPWSecurity Members

        bool IPPWSecurity.HasSufficientSecurity(Type type, SecurityActionFlag securityActionFlag)
        {
            Contract.Assume(
                Thread.CurrentPrincipal.Identity != null
                && Thread.CurrentPrincipal.Identity.IsAuthenticated);

            return default(bool);
        }

        void IPPWSecurity.CheckSecurity(Type type, SecurityActionFlag securityActionFlag)
        {
            Contract.Assume(
                Thread.CurrentPrincipal.Identity != null
                && Thread.CurrentPrincipal.Identity.IsAuthenticated);
        }

        #endregion
    }
}
