internal void DecodeSecurityAttribute <T>(Symbol targetSymbol, CSharpCompilation compilation, ref DecodeWellKnownAttributeArguments <AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) where T : WellKnownAttributeData, ISecurityAttributeTarget, new() { Debug.Assert(!this.HasErrors); bool hasErrors; Cci.SecurityAction action = DecodeSecurityAttributeAction(targetSymbol, compilation, arguments.AttributeSyntaxOpt, out hasErrors, arguments.Diagnostics); if (!hasErrors) { T data = arguments.GetOrCreateData <T>(); SecurityWellKnownAttributeData securityData = data.GetOrCreateData(); securityData.SetSecurityAttribute(arguments.Index, action, arguments.AttributesCount); if (this.IsTargetAttribute(targetSymbol, AttributeDescription.PermissionSetAttribute)) { string resolvedPathForFixup = DecodePermissionSetAttribute(compilation, arguments.AttributeSyntaxOpt, arguments.Diagnostics); if (resolvedPathForFixup != null) { securityData.SetPathForPermissionSetAttributeFixup(arguments.Index, resolvedPathForFixup, arguments.AttributesCount); } } } }
public void SetSecurityAttribute(int attributeIndex, Cci.SecurityAction action, int totalSourceAttributes) { Debug.Assert(attributeIndex >= 0 && attributeIndex < totalSourceAttributes); Debug.Assert(action != 0); if (_lazySecurityActions == null) { Interlocked.CompareExchange(ref _lazySecurityActions, new byte[totalSourceAttributes], null); } Debug.Assert(_lazySecurityActions.Length == totalSourceAttributes); _lazySecurityActions[attributeIndex] = (byte)action; }
private static Location GetSecurityAttributeActionSyntaxLocation(AttributeSyntax nodeOpt, Cci.SecurityAction value, out string displayString) { if ((object)nodeOpt == null) { displayString = ""; return(NoLocation.Singleton); } if (nodeOpt.ArgumentList.Arguments.IsEmpty()) { // Optional SecurityAction parameter with default value. displayString = value.ToString(); return(nodeOpt.Location); } AttributeArgumentSyntax argSyntax = nodeOpt.ArgumentList.Arguments[0]; displayString = argSyntax.ToString(); return(argSyntax.Location); }
private bool ValidateSecurityAction(Cci.SecurityAction securityAction, Symbol targetSymbol, AttributeSyntax nodeOpt, DiagnosticBag diagnostics) { Debug.Assert((object)targetSymbol != null); Debug.Assert(targetSymbol.Kind == SymbolKind.Assembly || targetSymbol.Kind == SymbolKind.NamedType || targetSymbol.Kind == SymbolKind.Method); bool isPermissionRequestAction; switch (securityAction) { case Cci.SecurityAction.InheritanceDemand: case Cci.SecurityAction.LinkDemand: if (this.IsTargetAttribute(targetSymbol, AttributeDescription.PrincipalPermissionAttribute)) { // CS7052: SecurityAction value '{0}' is invalid for PrincipalPermission attribute string displayString; Location syntaxLocation = GetSecurityAttributeActionSyntaxLocation(nodeOpt, securityAction, out displayString); diagnostics.Add(ErrorCode.ERR_PrincipalPermissionInvalidAction, syntaxLocation, displayString); return(false); } isPermissionRequestAction = false; break; case Cci.SecurityAction.Undocumented: // Native compiler allows security action value 1 for security attributes on types/methods, even though there is no corresponding field in System.Security.Permissions.SecurityAction enum. // We will maintain compatibility. case Cci.SecurityAction.Assert: case Cci.SecurityAction.Demand: case Cci.SecurityAction.PermitOnly: case Cci.SecurityAction.Deny: isPermissionRequestAction = false; break; case Cci.SecurityAction.RequestMinimum: case Cci.SecurityAction.RequestOptional: case Cci.SecurityAction.RequestRefuse: isPermissionRequestAction = true; break; default: { // CS7049: Security attribute '{0}' has an invalid SecurityAction value '{1}' string displayString; Location syntaxLocation = GetSecurityAttributeActionSyntaxLocation(nodeOpt, securityAction, out displayString); diagnostics.Add(ErrorCode.ERR_SecurityAttributeInvalidAction, syntaxLocation, (object)nodeOpt != null ? nodeOpt.GetErrorDisplayName() : "", displayString); return(false); } } // Validate security action for symbol kind if (isPermissionRequestAction) { if (targetSymbol.Kind == SymbolKind.NamedType || targetSymbol.Kind == SymbolKind.Method) { // Types and methods cannot take permission requests. // CS7051: SecurityAction value '{0}' is invalid for security attributes applied to a type or a method string displayString; Location syntaxLocation = GetSecurityAttributeActionSyntaxLocation(nodeOpt, securityAction, out displayString); diagnostics.Add(ErrorCode.ERR_SecurityAttributeInvalidActionTypeOrMethod, syntaxLocation, displayString); return(false); } } else { if (targetSymbol.Kind == SymbolKind.Assembly) { // Assemblies cannot take declarative security. // CS7050: SecurityAction value '{0}' is invalid for security attributes applied to an assembly string displayString; Location syntaxLocation = GetSecurityAttributeActionSyntaxLocation(nodeOpt, securityAction, out displayString); diagnostics.Add(ErrorCode.ERR_SecurityAttributeInvalidActionAssembly, syntaxLocation, displayString); return(false); } } return(true); }