5

私の機能のいくつかは、UniversalXPConnect特権を有効にする必要があります。

netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');

したがって、私の関数は次のようになります。

function oneOfMyFunctions() {
    netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');

    // ...
}

実は、私も特権が拒否された場合tryを例外にしています。catch次のようになります。

try {
    netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');

    // ...
} catch (e) {
    // ...
}

それを別の関数にして、次のように関数内から呼び出すことをお勧めします。

function oneOfMyFunctions() {
    if (enablePrivilege()) {
        // ...
    } else {
        // ...
    }
}

関数enablePrivilegeが次のようになるとします。

function enablePrivilege() {
    try {
        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
    } catch (e) {
        return false;
    }

    return true;
}

ただし、セキュリティ上の理由から、権限は要求関数の範囲内でのみ付与されるため、これは不可能です。

では、唯一のオプションは、そのコード ブロックを各関数に含めることですか?

アップデート:

他のいくつかの例外についても説明tryするのでcatch、最終的には次の設計になりました。

function readFile(path, start, length) {
    netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');

    var file = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
    file.initWithPath(path);

    var istream = Components.classes['@mozilla.org/network/file-input-stream;1'].createInstance(Components.interfaces.nsIFileInputStream);
    istream.init(file, -1, -1, false);

    istream.QueryInterface(Components.interfaces.nsISeekableStream);
    istream.seek(0, start);

    var bstream = Components.classes['@mozilla.org/binaryinputstream;1'].createInstance(Components.interfaces.nsIBinaryInputStream);
    bstream.setInputStream(istream);

    return bstream.readBytes(length);
}

var filepath = 'C:\\test.txt', start = 440, length = 5;

try {
    console.log(readFile(filepath, start, length));
} catch (e) {
    if (e.name == 'Error') console.log('The privilege to read the file is not granted.');
    else console.log('An error happened trying to read the file.');
}
4

1 に答える 1

2

enablePrivilege を、関数をパラメーターとして受け入れ、それ自体の内部で呼び出す一種のラッパー関数にすることができます。

function enablePrivilege(funcParam) {
    //enable privileges, in try-catch
    funcParam();
}

そのように呼び出すと

enablePrivilege(oneOfMyFunctions);

enablePrivilege のスコープ内で呼び出されるため、特権を必要とする関数には特権が必要です。

于 2011-07-13T14:08:53.723 に答える