CheckPermission.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. //------------------------------------------------------------------------------
  2. //
  3. // System.IO.CheckPermission.cs
  4. //
  5. // Copyright (C) 2001 Moonlight Enterprises, All Rights Reserved
  6. //
  7. // Author: Jim Richardson, [email protected]
  8. // Created: Saturday, August 25, 2001
  9. //
  10. // NOTE: All contributors can freely add to this class or make modifications
  11. // that do not break existing usage of methods
  12. //------------------------------------------------------------------------------
  13. using System;
  14. using System.Security;
  15. using System.Security.Permissions;
  16. namespace System.IO.Private
  17. {
  18. /// <summary>
  19. /// A utility class to assist with various permission validation in System.IO
  20. /// </summary>
  21. public sealed class CheckPermission
  22. {
  23. /// <summary>
  24. /// Generates and exception if caller doesn't have flags access to filesystem item specified by path
  25. /// </summary>
  26. public static void Demand(FileIOPermissionAccess flags, string path)
  27. {
  28. FileIOPermission ioPerm = new FileIOPermission(flags, path);
  29. ioPerm.Demand();
  30. }
  31. public static void Access(FileAccess access, string path)
  32. {
  33. switch(access)
  34. {
  35. case FileAccess.Read:
  36. Demand(FileIOPermissionAccess.Read, path);
  37. break;
  38. case FileAccess.Write:
  39. Demand(FileIOPermissionAccess.Write, path);
  40. break;
  41. case FileAccess.ReadWrite:
  42. Demand(FileIOPermissionAccess.Read | FileIOPermissionAccess.Write, path);
  43. break;
  44. default:
  45. // TODO: determine what best to do here
  46. throw new ArgumentException("Invalid FileAccess parameter");
  47. }
  48. }
  49. public static void ModeAccess(FileMode mode, FileAccess access, string path, bool exists)
  50. {
  51. // TODO: this logic isn't entirely complete and accurate, yet
  52. if((mode & (FileMode.CreateNew | FileMode.Create)) != 0)
  53. {
  54. CheckPermission.Demand(FileIOPermissionAccess.Write, Path.GetDirectoryName(path));
  55. }
  56. else if((mode & FileMode.OpenOrCreate) != 0)
  57. {
  58. if(!exists)
  59. {
  60. CheckPermission.Demand(FileIOPermissionAccess.Write, Path.GetDirectoryName(path));
  61. }
  62. else
  63. {
  64. CheckPermission.Access(access, path);
  65. }
  66. }
  67. else if(exists)
  68. {
  69. CheckPermission.Access(access, path);
  70. }
  71. else
  72. {
  73. throw new FileNotFoundException();
  74. }
  75. }
  76. }
  77. } // namespace System.IO.Private