//
// 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.
//
// 
using System;
using System.Security;
using System.Security.Permissions;
using System.IO;

namespace CLRUnleashed
{
	// Kod uruchomiony na komputerze otrzymuje domyślnie ustawienia FullTrust.
	// Jeśli zostanie to zmienione na Everything (wszystkie znane i wbudowane
	// uprawnienia), to własne uprawienia zostaną zignorowane. Oznaczać to będzie
	// powstanie wyjątku zabezpieczeń.
	[CustomPermissionAttribute(SecurityAction.InheritanceDemand)]
	public class MyClass
	{
		public MyClass()
		{    
		}   

		public virtual void Message()
		{
			Console.WriteLine("To jest wiadomość z MyClass");
		}
	}
	public class YourClass : MyClass
	{
		public override void Message()
		{
			Console.WriteLine("To jest wiadomość z YourClass");
		}
	}
	/// <summary>
	/// Podsumowanie dla SecurityInheritance.
	/// </summary>
	class SecurityInheritance
	{
		/// <summary>
		/// Główny punkt wejścia dla aplikacji.
		/// </summary>
		[STAThread]
		static void Main(string[] args)
		{
			CustomPermission perm = 
				new CustomPermission(PermissionState.Unrestricted);
			NamedPermissionSet pset = 
				new NamedPermissionSet("MyPermissionSet", PermissionState.None);
			pset.Description = "Zestaw uprawnień zawierający własne uprawnienia";
			pset.AddPermission(perm);
			StreamWriter file = new StreamWriter("mypermissionset.xml");
			file.Write(pset.ToXml());
			file.Close();
			MyClass mc = new MyClass();
			mc.Message();
			YourClass yc = new YourClass();
			yc.Message();
		}
	}
}
