3 // Copyright (c) Microsoft Corporation. All rights reserved.
8 // <OWNER>[....]</OWNER>
11 namespace System.Security.Permissions
14 using System.Security;
15 using System.Security.Util;
17 using System.Runtime.Serialization;
18 using System.Reflection;
19 using System.Collections;
20 using System.Globalization;
21 using System.Diagnostics.Contracts;
24 [System.Runtime.InteropServices.ComVisible(true)]
25 public enum UIPermissionWindow
27 // No window use allowed at all.
30 // Only allow safe subwindow use (for embedded components).
31 SafeSubWindows = 0x01,
33 // Safe top-level window use only (see specification for details).
34 SafeTopLevelWindows = 0x02,
36 // All windows and all event may be used.
42 [System.Runtime.InteropServices.ComVisible(true)]
43 public enum UIPermissionClipboard
45 // No clipboard access is allowed.
48 // Paste from the same app domain only.
51 // Any clipboard access is allowed.
57 [System.Runtime.InteropServices.ComVisible(true)]
59 sealed public class UIPermission
60 : CodeAccessPermission, IUnrestrictedPermission, IBuiltInPermission
62 //------------------------------------------------------
66 //------------------------------------------------------
68 private UIPermissionWindow m_windowFlag;
69 private UIPermissionClipboard m_clipboardFlag;
71 //------------------------------------------------------
73 // PUBLIC CONSTRUCTORS
75 //------------------------------------------------------
77 public UIPermission(PermissionState state)
79 if (state == PermissionState.Unrestricted)
81 SetUnrestricted( true );
83 else if (state == PermissionState.None)
85 SetUnrestricted( false );
90 throw new ArgumentException(Environment.GetResourceString("Argument_InvalidPermissionState"));
94 public UIPermission(UIPermissionWindow windowFlag, UIPermissionClipboard clipboardFlag )
96 VerifyWindowFlag( windowFlag );
97 VerifyClipboardFlag( clipboardFlag );
99 m_windowFlag = windowFlag;
100 m_clipboardFlag = clipboardFlag;
103 public UIPermission(UIPermissionWindow windowFlag )
105 VerifyWindowFlag( windowFlag );
107 m_windowFlag = windowFlag;
110 public UIPermission(UIPermissionClipboard clipboardFlag )
112 VerifyClipboardFlag( clipboardFlag );
114 m_clipboardFlag = clipboardFlag;
118 //------------------------------------------------------
120 // PUBLIC ACCESSOR METHODS
122 //------------------------------------------------------
124 public UIPermissionWindow Window
128 VerifyWindowFlag(value);
130 m_windowFlag = value;
139 public UIPermissionClipboard Clipboard
143 VerifyClipboardFlag(value);
145 m_clipboardFlag = value;
150 return m_clipboardFlag;
154 //------------------------------------------------------
156 // PRIVATE AND PROTECTED HELPERS FOR ACCESSORS AND CONSTRUCTORS
158 //------------------------------------------------------
160 private static void VerifyWindowFlag(UIPermissionWindow flag)
162 if (flag < UIPermissionWindow.NoWindows || flag > UIPermissionWindow.AllWindows)
164 throw new ArgumentException(Environment.GetResourceString("Arg_EnumIllegalVal", (int)flag));
166 Contract.EndContractBlock();
169 private static void VerifyClipboardFlag(UIPermissionClipboard flag)
171 if (flag < UIPermissionClipboard.NoClipboard || flag > UIPermissionClipboard.AllClipboard)
173 throw new ArgumentException(Environment.GetResourceString("Arg_EnumIllegalVal", (int)flag));
175 Contract.EndContractBlock();
180 m_windowFlag = UIPermissionWindow.NoWindows;
181 m_clipboardFlag = UIPermissionClipboard.NoClipboard;
184 private void SetUnrestricted( bool unrestricted )
188 m_windowFlag = UIPermissionWindow.AllWindows;
189 m_clipboardFlag = UIPermissionClipboard.AllClipboard;
194 //------------------------------------------------------
196 // OBJECT METHOD OVERRIDES
198 //------------------------------------------------------
199 public String ToString()
202 StringBuilder sb = new StringBuilder();
203 sb.Append("UIPermission(");
204 if (IsUnrestricted())
206 sb.Append("Unrestricted");
210 sb.Append(m_stateNameTableWindow[m_windowFlag]);
212 sb.Append(m_stateNameTableClipboard[m_clipboardFlag]);
216 return sb.ToString();
218 return super.ToString();
223 //------------------------------------------------------
225 // CODEACCESSPERMISSION IMPLEMENTATION
227 //------------------------------------------------------
229 public bool IsUnrestricted()
231 return m_windowFlag == UIPermissionWindow.AllWindows && m_clipboardFlag == UIPermissionClipboard.AllClipboard;
234 //------------------------------------------------------
236 // IPERMISSION IMPLEMENTATION
238 //------------------------------------------------------
240 public override bool IsSubsetOf(IPermission target)
244 // Only safe subset if this is empty
245 return m_windowFlag == UIPermissionWindow.NoWindows && m_clipboardFlag == UIPermissionClipboard.NoClipboard;
250 UIPermission operand = (UIPermission)target;
251 if (operand.IsUnrestricted())
253 else if (this.IsUnrestricted())
256 return this.m_windowFlag <= operand.m_windowFlag && this.m_clipboardFlag <= operand.m_clipboardFlag;
258 catch (InvalidCastException)
262 Environment.GetResourceString("Argument_WrongType", this.GetType().FullName)
268 public override IPermission Intersect(IPermission target)
274 else if (!VerifyType(target))
278 Environment.GetResourceString("Argument_WrongType", this.GetType().FullName)
282 UIPermission operand = (UIPermission)target;
283 UIPermissionWindow isectWindowFlags = m_windowFlag < operand.m_windowFlag ? m_windowFlag : operand.m_windowFlag;
284 UIPermissionClipboard isectClipboardFlags = m_clipboardFlag < operand.m_clipboardFlag ? m_clipboardFlag : operand.m_clipboardFlag;
285 if (isectWindowFlags == UIPermissionWindow.NoWindows && isectClipboardFlags == UIPermissionClipboard.NoClipboard)
288 return new UIPermission(isectWindowFlags, isectClipboardFlags);
291 public override IPermission Union(IPermission target)
297 else if (!VerifyType(target))
301 Environment.GetResourceString("Argument_WrongType", this.GetType().FullName)
305 UIPermission operand = (UIPermission)target;
306 UIPermissionWindow isectWindowFlags = m_windowFlag > operand.m_windowFlag ? m_windowFlag : operand.m_windowFlag;
307 UIPermissionClipboard isectClipboardFlags = m_clipboardFlag > operand.m_clipboardFlag ? m_clipboardFlag : operand.m_clipboardFlag;
308 if (isectWindowFlags == UIPermissionWindow.NoWindows && isectClipboardFlags == UIPermissionClipboard.NoClipboard)
311 return new UIPermission(isectWindowFlags, isectClipboardFlags);
314 public override IPermission Copy()
316 return new UIPermission(this.m_windowFlag, this.m_clipboardFlag);
319 #if FEATURE_CAS_POLICY
320 public override SecurityElement ToXml()
322 SecurityElement esd = CodeAccessPermission.CreatePermissionElement( this, "System.Security.Permissions.UIPermission" );
323 if (!IsUnrestricted())
325 if (m_windowFlag != UIPermissionWindow.NoWindows)
327 esd.AddAttribute( "Window", Enum.GetName( typeof( UIPermissionWindow ), m_windowFlag ) );
329 if (m_clipboardFlag != UIPermissionClipboard.NoClipboard)
331 esd.AddAttribute( "Clipboard", Enum.GetName( typeof( UIPermissionClipboard ), m_clipboardFlag ) );
336 esd.AddAttribute( "Unrestricted", "true" );
341 public override void FromXml(SecurityElement esd)
343 CodeAccessPermission.ValidateElement( esd, this );
344 if (XMLUtil.IsUnrestricted( esd ))
346 SetUnrestricted( true );
350 m_windowFlag = UIPermissionWindow.NoWindows;
351 m_clipboardFlag = UIPermissionClipboard.NoClipboard;
353 String window = esd.Attribute( "Window" );
355 m_windowFlag = (UIPermissionWindow)Enum.Parse( typeof( UIPermissionWindow ), window );
357 String clipboard = esd.Attribute( "Clipboard" );
358 if (clipboard != null)
359 m_clipboardFlag = (UIPermissionClipboard)Enum.Parse( typeof( UIPermissionClipboard ), clipboard );
361 #endif // FEATURE_CAS_POLICY
364 int IBuiltInPermission.GetTokenIndex()
366 return UIPermission.GetTokenIndex();
369 internal static int GetTokenIndex()
371 return BuiltInPermissionIndex.UIPermissionIndex;