Объявление FileIOPermission на специальных папках - PullRequest
1 голос
/ 17 сентября 2009

Я перечитал документацию, покопался в паутинах, и кажется, что то, что я хочу сделать, не может быть сделано без написания специального разрешения CAS. Итак, вот моя последняя попытка рва.

Я хочу, чтобы ТОЧНО определить FileIOPermission (Атрибут) в моем классе, чтобы требовать разрешения для пользовательского каталога MyDocuments. Этот каталог не совместим во всех операционных системах, и обычно к нему обращаются в .net через Path.GetFolderPath (я так думаю), передавая значение перечисления SpecialFolder. Есть ли в атрибуте FileIOPermissionAttribute какой-либо синтаксис «токена» или аналогичная функция, которая может быть сообщена среде выполнения: «Дайте мне доступ к этой специальной папке, где бы она ни находилась в этой системе»?

Если нет, думаю, мне придется написать собственный объект Permission, который по сути делает это ...

Спасибо!

1 Ответ

2 голосов
/ 18 сентября 2009

На самом деле вам не нужно настраиваемое разрешение для этого, но вам нужен настраиваемый атрибут, похожий на FileIOPermissionAttribute. В его методе CreatePermission вы можете создать FileIOPermission для фактического пути к папке, соответствующего значению SpecialFolder, переданному атрибуту. например (требуется дополнительная проверка):

[Serializable]
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Struct | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = true, Inherited = false)]
public sealed class SpecialFolderIOPermissionAttribute : CodeAccessSecurityAttribute
{
    private Environment.SpecialFolder _folder;
    private FileIOPermissionAccess _access;

    public SpecialFolderIOPermissionAttribute(SecurityAction action)
        : base(action)
    {
        this.Unrestricted = true;
    }

    public Environment.SpecialFolder Folder
    {
        get
        {
            return this._folder;
        }
        set
        {
            this._folder = value;
            this.Unrestricted = false;
        }
    }

    public FileIOPermissionAccess Access
    {
        get
        {
            return this._access;
        }
        set
        {
            this._access = value;
            this.Unrestricted = false;
        }
    }

    public override IPermission CreatePermission()
    {
        FileIOPermission permission;
        if (this.Unrestricted)
        {
            permission = new FileIOPermission(PermissionState.Unrestricted);
        }
        else
        {
            permission = new FileIOPermission(this.Access, Environment.GetFolderPath(this.Folder));
        }

        return permission;
    }
}

Здесь следует обратить внимание на то, что Environment.GetFolderPath будет запрашивать доступ PathDiscovery к целевой папке, поэтому вам придется решить, хотите ли вы подтвердить это разрешение в своем методе CreatePermission. (Лично я подозреваю, что осложнения вокруг этого могут быть одной из причин того, что команда BCL вообще не реализовала поддержку специальных папок в FileIOPermissionAttribute.)

...