//
// Copyright (c) 2002
// Ronald Kevin Burton
//
// Z poniższym kodem nie jest związana żadna gwarancja poprawności działania.
// Program został dołączony do książki ".NET CLR. Księga eksperta" w celu
// ilustracji koncepcji i zasad przedstawionych w tej książce. Program może być 
// używany na własne ryzyko.
//
// Przyznaje się prawo do użycia lub kopiowania tego oprogramowania do dowolnego celu
// bez konieczności ponoszenia żadnych opłat pod warunkiem, że powyższe uwagi zostaną 
// zachowane we wszystkich kopiach. Przyznaje się także prawo do modyfikacji kodu
// i dystrybucji zmodyfikowanego kodu pod warunkiem zachowania powyższych uwag
// oraz dołączenia informacji mówiącej o modyfikacji kodu.
//
//
// Security\ImperativeSecurity.cs
using System;
using System.Security;
using System.Security.Permissions;
using System.Runtime.InteropServices;

class NativeMethods
{
    // Wywołanie do niezarządzanego kodu. Wykonanie tej metody wymaga
    // uprawnienia zabezpieczeń UnmanagedCode. Próba wywołania tej metody
    // bez takiego uprawnienia spowoduje zgłoszenie wyjatku SecurityException:
    [DllImport("user32.dll")]
    public static extern int MessageBox(uint hWnd, string lpText, 
       string lpCaption, uint uType);
}

class MainClass
{
    private static void CallUnmanagedCodeWithoutPermission()
    {
        // Utworzenie obiektu uprawnień zabezpieczeń w celu opisania
		// uprawnienia UnmanagedCode:
        SecurityPermission perm = 
           new SecurityPermission(SecurityPermissionFlag.UnmanagedCode);

        // Odrzuca UnmanagedCode z aktualnego zestawu uprawnień.
		// Żadna metoda wywoływana w tym wątku nie uzyska dostępu 
		// do niezarządzanego kodu aż do momentu powrotu tej metody.
        perm.Deny();

        try
        {
            Console.WriteLine("Próba wywołania niezarządzanego kodu bez uprawnienia.");
            NativeMethods.MessageBox(0, "Witaj świecie!", "", 0);
            Console.WriteLine("Wywołano niezarządzany kod bez uprawnienia. Błąd!");
        }
        catch (SecurityException)
        {
            Console.WriteLine("Przechwycono wyjątek zabezpieczeń w czasie próby wywołania niezarządzanego kodu.");
        }
    }

    private static void CallUnmanagedCodeWithPermission()
    {
        // Utworzenie obiektu uprawnień zabezpieczeń w celu opisania
		// uprawnienia UnmanagedCode:
        SecurityPermission perm = 
           new SecurityPermission(SecurityPermissionFlag.UnmanagedCode);

		// Sprawdzenie, czy przyznano wszystkie potrzebne uprawnienia. 
		perm.Demand();

		// Sprawdzenie obecności uprawnienia pozwalającego na dostęp do niezarządzanego kodu.
        // Jeśli takie uprawnienie nie jest dostępne, to to wywołanie zgłosi
        // wyjątek SecurityException.
        perm.Assert();

        try
        {
            Console.WriteLine("Próba wywołania niezarządzanego kodu bez uprawnienia.");
            NativeMethods.MessageBox(0, "Witaj świecie!", "", 0);
            Console.WriteLine("Wywołano niezarządzany kod bez uprawnienia.");
        }
        catch (SecurityException)
        {
            Console.WriteLine("Przechwycono wyjątek zabezpieczeń w czasie próby wywołania niezarządzanego kodu.");
        }
    }

    public static void Main() 
    {
        CallUnmanagedCodeWithoutPermission();
        CallUnmanagedCodeWithPermission();
    }
}
