зеркало из https://github.com/mono/ikvm-fork.git
Added support for assembly declarative security pseudo custom attribute annotations.
This commit is contained in:
Родитель
d33c145753
Коммит
597db09496
|
@ -126,6 +126,55 @@ namespace IKVM.Internal
|
||||||
return assemblyBuilder.GetName();
|
return assemblyBuilder.GetName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static PermissionSet Combine(PermissionSet p1, PermissionSet p2)
|
||||||
|
{
|
||||||
|
if (p1 == null)
|
||||||
|
{
|
||||||
|
return p2;
|
||||||
|
}
|
||||||
|
if (p2 == null)
|
||||||
|
{
|
||||||
|
return p1;
|
||||||
|
}
|
||||||
|
return p1.Union(p2);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GetAssemblyPermissions(out PermissionSet requiredPermissions, out PermissionSet optionalPermissions, out PermissionSet refusedPermissions)
|
||||||
|
{
|
||||||
|
requiredPermissions = null;
|
||||||
|
optionalPermissions = null;
|
||||||
|
refusedPermissions = null;
|
||||||
|
foreach (object[] def in assemblyAnnotations)
|
||||||
|
{
|
||||||
|
string annotationClass = (string)def[1];
|
||||||
|
annotationClass = annotationClass.Replace('/', '.').Substring(1, annotationClass.Length - 2);
|
||||||
|
if (annotationClass.EndsWith(DotNetTypeWrapper.AttributeAnnotationSuffix))
|
||||||
|
{
|
||||||
|
Type annot = Type.GetType(DotNetTypeWrapper.DemangleTypeName(annotationClass.Substring(0, annotationClass.Length - DotNetTypeWrapper.AttributeAnnotationSuffix.Length)));
|
||||||
|
if (annot != null && annot.IsSubclassOf(typeof(SecurityAttribute)))
|
||||||
|
{
|
||||||
|
SecurityAction action;
|
||||||
|
PermissionSet permSet;
|
||||||
|
if (Annotation.MakeDeclSecurity(annot, def, out action, out permSet))
|
||||||
|
{
|
||||||
|
switch (action)
|
||||||
|
{
|
||||||
|
case SecurityAction.RequestMinimum:
|
||||||
|
requiredPermissions = Combine(requiredPermissions, permSet);
|
||||||
|
break;
|
||||||
|
case SecurityAction.RequestOptional:
|
||||||
|
optionalPermissions = Combine(optionalPermissions, permSet);
|
||||||
|
break;
|
||||||
|
case SecurityAction.RequestRefuse:
|
||||||
|
refusedPermissions = Combine(refusedPermissions, permSet);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
internal ModuleBuilder CreateModuleBuilder()
|
internal ModuleBuilder CreateModuleBuilder()
|
||||||
{
|
{
|
||||||
AssemblyName name = new AssemblyName();
|
AssemblyName name = new AssemblyName();
|
||||||
|
@ -139,13 +188,17 @@ namespace IKVM.Internal
|
||||||
name.KeyPair = new StrongNameKeyPair(keycontainer);
|
name.KeyPair = new StrongNameKeyPair(keycontainer);
|
||||||
}
|
}
|
||||||
name.Version = new Version(version);
|
name.Version = new Version(version);
|
||||||
|
PermissionSet requiredPermissions;
|
||||||
|
PermissionSet optionalPermissions;
|
||||||
|
PermissionSet refusedPermissions;
|
||||||
|
GetAssemblyPermissions(out requiredPermissions, out optionalPermissions, out refusedPermissions);
|
||||||
assemblyBuilder =
|
assemblyBuilder =
|
||||||
#if IKVM_REF_EMIT
|
#if IKVM_REF_EMIT
|
||||||
AssemblyBuilder
|
AssemblyBuilder
|
||||||
#else
|
#else
|
||||||
AppDomain.CurrentDomain
|
AppDomain.CurrentDomain
|
||||||
#endif
|
#endif
|
||||||
.DefineDynamicAssembly(name, AssemblyBuilderAccess.ReflectionOnly, assemblyDir);
|
.DefineDynamicAssembly(name, AssemblyBuilderAccess.ReflectionOnly, assemblyDir, requiredPermissions, optionalPermissions, refusedPermissions);
|
||||||
ModuleBuilder moduleBuilder;
|
ModuleBuilder moduleBuilder;
|
||||||
moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName, assemblyFile, this.EmitDebugInfo);
|
moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName, assemblyFile, this.EmitDebugInfo);
|
||||||
if(this.EmitStackTraceInfo)
|
if(this.EmitStackTraceInfo)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче