ファイルパーミッションへのアクセス

NIO.2で取り組んでいる多くの問題の一つが,Java SEプラットフォームではファイルパーミッションや他のセキュリティ関連のファイル属性にアクセスするための一連のAPIが提供されていないことです.例えば,chmod(1)のようなコマンドを実行するためにRuntime.execを使っているコードを見ることは,決して珍しくありません.
NIO.2の早期ドラフトレビュー仕様では,関連する属性をグループ分けすることでファイル属性の問題を解決したことがわかるでしょう.そのために,そのグループに属性の読み出し専用又は更新可能なビューを提供するFileAttributeViewインタフェースが定義されています.この仕様は、多くの属性ビューを定義していますが,その中でファイルシステムの実装がサポートするためには、その中でBasicFileAttributeViewクラスだけは必要です(BasicFileAttributeViewクラスは、ファイルサイズや最終更新時刻のようなさまざまなファイルシステムで共通している限定された基本属性へのアクセスを提供します.).
BasicFileAttributeViewクラスだけでなく,ファイルシステムの実装は他のファイル属性ビューをサポートすることができます.この仕様では,POSIX標準関連を実装したプラットフォームに共通にあるファイル属性にアクセスするために,PosixFileAttributeViewクラスを定義しています.ここでは,"foo"というファイルのオーナーとパーミッションを印字するために,この属性ビューのインスタンスを使う簡単な例を示します.次に,このファイルへのその他(オーナーやグループ以外)のアクセスを拒否するために,パーミッションを変更します.

PosixFileAttributeView view = PathReference.from("foo")
    .newFileAttributeView(PosixFileAttributeView.class);

// 一括読み込み
PosixFileAttributes attrs = view.readAttributes();

int perms = attrs.getPermissions();

// "-rw-r--r-- alice bandits"を印字
System.out.format("%s?t%s?t%s%n", 
    PosixFilePermission.toString(perms),
    attrs.getOwner(),
    attrs.getGroup());    

// その他のアクセスを拒否
perms &= ~OTHERS_READ & ~OTHERS_WRITE & ~OTHERS_EXECUTE;
view.updatePermissions(perms); 

ここで説明が必要かもしれない唯一のコードは,PosixFileAttributeViewクラスのインスタンスを取得しているコードです.FileAttributeViewsを型トークンで選択しますが,このコードはファイル"foo"に関連付けられているPosixFileAttributeViewクラスのインスタンスを選択します.
コメントからファイル"foo"が"bandits"グループによって所有されていることがわかるので,グループを変更してこれを修正できます.

UserPrincipal cops = view.lookupPrincipalByGroupName("cops");
view.updateOwners(null, cops);

ファイルパーミッションの他の役目は,ファイルを時々初期パーミッション(もちろん,umaskが適用されます)を指定して作る必要があることです.ここでは,"securefile"という新しいファイルを初期パーミッションを指定して作成して,ファイルをランダムアクセスするためにオープンする例を示します.

PathReference file = PathReference.from("securefile");
PosixFileAttributeView view = ...

Attribute<Integer> attr = view.newPermissionsAttribute()
    .setValue(OWNER_READ | OWNER_WRITE | GROUP_READ | GROUP_WRITE);

SeekableByteChannel sbc = file.newSeekableByteChannel(CREATE_NEW | READWRITE, attr);

ここでは,PosixFileAttributeViewクラスについて簡単に説明しました.他に,この仕様でセキュリティ関連属性へのアクセスを提供するファイル属性ビューがAclFileAttributViewクラスです.これは,NFSバージョン4のACLモデルを基にしたアクセス制御リスト(ACL)へのアクセスを提供します.それは,ACLをサポートするファイルシステムにとっては,興味深いことでしょう.時間がある時に,この属性ビューの使い方について簡単に書きたいと思います.
(Alan Bateman "Accessing file permissions"を翻訳.)