Publish date: 2013-11-13
Code Access Security and ADO.NET. Usage of OleDbPermission. (C#, NET4.x)
using System;
using System.Data;
using System.Data.Common;
using lcpi.data.oledb;
using System.Security;
using System.Security.Permissions;
using System.Globalization;
using System.Threading;
namespace Sample_0013{
////////////////////////////////////////////////////////////////////////////////
// Attention:
// You should install providers into GAC!
////////////////////////////////////////////////////////////////////////////////
//class TestObject
public class TestObject:MarshalByRefObject
{
private bool m_enter=false;
private bool m_try_open=false;
private object m_rec_count=null;
private bool m_exit=false;
public void Exec(string connectionString)
{
m_enter=true;
using (var cn=new OleDbConnection(connectionString))
{
m_try_open=true;
cn.Open();
using(var tr=cn.BeginTransaction(IsolationLevel.RepeatableRead))
{
using(var cmd=new OleDbCommand("select count(*) from rdb$database",cn,tr))
{
m_rec_count=cmd.ExecuteScalar();
}//using cmd
tr.Commit();
}
}//using cn
m_exit=true;
}//Exec
//-----------------------------------------------------------------------
public string State
{
get
{
return string.Format("enter:{0}, try_open:{1}, rec_count:{2}, exit:{3}",
m_enter,
m_try_open,
Helper__ToStr(m_rec_count),
m_exit);
}//get
}//State
//-----------------------------------------------------------------------
private static string Helper__ToStr(object x)
{
if(Object.ReferenceEquals(x,null))
return "#NULL";
if(DBNull.Value==x)
return "#DBNULL";
return x.ToString();
}//Helper__ToStr
};//class TestObject
////////////////////////////////////////////////////////////////////////////////
//class Program
class Program
{
//-----------------------------------------------------------------------
private const string c_cn_str
="provider=LCPI.IBProvider.3;"
+"location=localhost:d:\\database\\ibp_test_fb25_d3.gdb;"
+"user id=gamer;"
+"password=vermut;";
//-----------------------------------------------------------------------
private static int Main()
{
int resultCode=1;
try
{
Main_Impl();
}
catch(Exception e)
{
resultCode=1;
Console.WriteLine("");
Console.WriteLine("ERROR: {0} - {1}",e.Source,e.Message);
}//catch
return resultCode;
}//Main
//-----------------------------------------------------------------------
private static readonly Action[] sm_Tests=
{
Exec__no_OleDbPermission,
Exec__ok,
Exec__badCnStr,
Exec__Unrestricted,
};//sm_Tests
//-----------------------------------------------------------------------
private static void Main_Impl()
{
var OldCulture=Thread.CurrentThread.CurrentUICulture;
try
{
Thread.CurrentThread.CurrentUICulture=CultureInfo.InvariantCulture;
//--------------------------------------- TESTS
for(int i=0,_c=sm_Tests.Length;i!=_c;++i)
{
Console.WriteLine("---------------------------- {0}. {1}",
(i+1),sm_Tests[i].Method.Name);
sm_Tests[i]();
Console.WriteLine("");
}//for i
}
finally
{
if(!Object.ReferenceEquals(Thread.CurrentThread.CurrentUICulture,OldCulture))
Thread.CurrentThread.CurrentUICulture=OldCulture;
}//finally
}//Main_Impl
//-----------------------------------------------------------------------
static void Exec__no_OleDbPermission()
{
var permissions
=new PermissionSet(PermissionState.None);
permissions.AddPermission(Helper__CreateExecutePermission());
AppDomain testDomain=null;
try
{
testDomain=Helper_CreateTestDomain("NoSqlPermissions",
permissions);
var testObject=Helper__CreateTestObject(testDomain);
Console.WriteLine("Try call testObject.Exec ...");
Helper__Exec_Failed(testObject,c_cn_str);
Console.WriteLine("OK [{0}]",testObject.State);
}
finally
{
if(!Object.ReferenceEquals(testDomain,null))
AppDomain.Unload(testDomain);
}//finally
}//Exec__no_OleDbPermission
//-----------------------------------------------------------------------
static void Exec__ok()
{
var permissions
=new PermissionSet(PermissionState.None);
permissions.AddPermission(Helper__CreateExecutePermission());
permissions.AddPermission(Helper__CreateOleDbPermission(c_cn_str));
AppDomain testDomain=null;
try
{
testDomain=Helper_CreateTestDomain("Exec__ok",
permissions);
var testObject=Helper__CreateTestObject(testDomain);
Helper__Exec(testObject,c_cn_str);
Console.WriteLine("OK [{0}]",testObject.State);
}
finally
{
if(!Object.ReferenceEquals(testDomain,null))
AppDomain.Unload(testDomain);
}//finally
}//Exec__ok
//-----------------------------------------------------------------------
static void Exec__badCnStr()
{
var permissions
=new PermissionSet(PermissionState.None);
permissions.AddPermission(Helper__CreateExecutePermission());
permissions.AddPermission(Helper__CreateOleDbPermission(c_cn_str));
AppDomain testDomain=null;
try
{
testDomain=Helper_CreateTestDomain("Exec__badCnStr",
permissions);
var testObject=Helper__CreateTestObject(testDomain);
Helper__Exec_Failed(testObject,"prop1=val1;"+c_cn_str);
Console.WriteLine("OK [{0}]",testObject.State);
}
finally
{
if(!Object.ReferenceEquals(testDomain,null))
AppDomain.Unload(testDomain);
}//finally
}//Exec__badCnStr
//-----------------------------------------------------------------------
static void Exec__Unrestricted()
{
var permissions
=new PermissionSet(PermissionState.None);
permissions.AddPermission(Helper__CreateExecutePermission());
permissions.AddPermission(new OleDbPermission(PermissionState.Unrestricted));
AppDomain testDomain=null;
try
{
testDomain=Helper_CreateTestDomain("Exec__Unrestricted",
permissions);
var testObject=Helper__CreateTestObject(testDomain);
Helper__Exec(testObject,"prop1=val1;"+c_cn_str);
Console.WriteLine("OK [{0}]",testObject.State);
}
finally
{
if(!Object.ReferenceEquals(testDomain,null))
AppDomain.Unload(testDomain);
}//finally
}//Exec__Unrestricted
//helper methods --------------------------------------------------------
private static AppDomain Helper_CreateTestDomain(string name,
PermissionSet permissions)
{
Console.WriteLine("Create testDomain [{0}] ...",name);
var appDomainSetup
=new AppDomainSetup();
appDomainSetup.ApplicationBase
=AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
//----------------------------------------
return AppDomain.CreateDomain(name,
AppDomain.CurrentDomain.Evidence,
appDomainSetup,
permissions);
}//Helper_CreateTestDomain
//-----------------------------------------------------------------------
private static TestObject Helper__CreateTestObject(AppDomain testDomain)
{
Console.WriteLine("Create testObject ...");
var TestObjectType=typeof(TestObject);
return (TestObject)testDomain.CreateInstanceAndUnwrap
(TestObjectType.Assembly.FullName,
TestObjectType.FullName);
}//Helper__CreateTestObject
//-----------------------------------------------------------------------
private static SecurityPermission Helper__CreateExecutePermission()
{
const SecurityPermissionFlag spflags
= 0
//|SecurityPermissionFlag.SkipVerification //required for .NET 3.5
|SecurityPermissionFlag.Execution
;
return new SecurityPermission(spflags);
}//Helper__CreateExecutePermission
//-----------------------------------------------------------------------
private static OleDbPermission Helper__CreateOleDbPermission(string cn_str)
{
var oledbPermission=new OleDbPermission(PermissionState.None);
if(!Object.ReferenceEquals(cn_str,null))
{
oledbPermission.Add(c_cn_str,
null,
KeyRestrictionBehavior.AllowOnly);
}//if
return oledbPermission;
}//Helper__CreateOleDbPermission
//-----------------------------------------------------------------------
private static void Helper__Exec_Failed(TestObject testObject,
string cn_str)
{
try
{
Helper__Exec(testObject,cn_str);
}
catch(SecurityException e)
{
Helper__PrintSecurityException(e);
return;
}//catch
throw new ApplicationException("We Wait The Exception!");
}//Helper__Exec_Failed
//-----------------------------------------------------------------------
private static void Helper__Exec(TestObject testObject,
string cn_str)
{
Console.WriteLine("Try call testObject.Exec(\"{0}\")...",cn_str);
testObject.Exec(cn_str);
}//Helper__Exec
//-----------------------------------------------------------------------
private static void Helper__PrintSecurityException(SecurityException e)
{
Console.WriteLine("Trap SecurityException");
Console.WriteLine(" PermissionType:");
Console.WriteLine(" {0}",e.PermissionType);
Console.WriteLine(" Source:");
Console.WriteLine(" {0}", e.Source);
Console.WriteLine(" Message:");
Console.WriteLine(" {0}", e.Message);
}//Helper__PrintSecurityException
};//class Program
////////////////////////////////////////////////////////////////////////////////
}//namespace Sample_0013
Output. Sample has been compiled for NET4.5 [Release].
---------------------------- 1. Exec__no_OleDbPermission
Create testDomain [NoSqlPermissions] ...
Create testObject ...
Try call testObject.Exec ...
Try call testObject.Exec("provider=LCPI.IBProvider.3;
location=localhost:d:\database\ibp_test_fb25_d3.gdb;
user id=gamer;password=vermut;")...
Trap SecurityException
PermissionType:
lcpi.data.oledb.OleDbPermission
Source:
mscorlib
Message:
Request for the permission of type 'lcpi.data.oledb.OleDbPermission,
lcpi.data.oledb.net4_5,
Version=1.0.0.1675, Culture=neutral,
PublicKeyToken=ff716095e8002e7e' failed.
OK [enter:True, try_open:True, rec_count:#NULL, exit:False]
---------------------------- 2. Exec__ok
Create testDomain [Exec__ok] ...
Create testObject ...
Try call testObject.Exec("provider=LCPI.IBProvider.3;
location=localhost:d:\database\ibp_test_fb25_d3.gdb;
user id=gamer;password=vermut;")...
OK [enter:True, try_open:True, rec_count:1, exit:True]
---------------------------- 3. Exec__badCnStr
Create testDomain [Exec__badCnStr] ...
Create testObject ...
Try call testObject.Exec("prop1=val1;provider=LCPI.IBProvider.3;
location=localhost:d:\database\ibp_test_fb25_d3.gdb;
user id=gamer;password=vermut;")...
Trap SecurityException
PermissionType:
lcpi.data.oledb.OleDbPermission
Source:
mscorlib
Message:
Request for the permission of type 'lcpi.data.oledb.OleDbPermission,
lcpi.data.oledb.net4_5,
Version=1.0.0.1675, Culture=neutral,
PublicKeyToken=ff716095e8002e7e' failed.
OK [enter:True, try_open:True, rec_count:#NULL, exit:False]
---------------------------- 4. Exec__Unrestricted
Create testDomain [Exec__Unrestricted] ...
Create testObject ...
Try call testObject.Exec("prop1=val1;provider=LCPI.IBProvider.3;
location=localhost:d:\database\ibp_test_fb25_d3.gdb;
user id=gamer;password=vermut;")...
OK [enter:True, try_open:True, rec_count:1, exit:True]
