ファイルのパーミッション(権限)を変更する

Recipe ID: fs-016

ファイルのパーミッション(読み取り・書き込み・実行権限)を変更する方法を解説します。
現在、Tauri の公式 fs プラグイン (@tauri-apps/plugin-fs) は、パーミッションを変更する機能(chmod に相当)を直接提供していません。
そのため、この機能を実現するには Rust 側でカスタムコマンドを作成 する必要があります。

前提条件

このレシピでは、Rust の標準ライブラリ (std::fs) を使用したカスタムコマンドを実装します。

1. フロントエンドから作成する (TypeScript)

@tauri-apps/api/coreinvoke を使って、Rust 側で定義したコマンドを呼び出します。

Unix パーミッションの変更 (macOS/Linux)

import { invoke } from '@tauri-apps/api/core';

async function changePermission() {
  try {
    // 0o755 (rwxr-xr-x) に変更
    // JSでは8進数を渡すか、10進数に変換して渡します。
    // 0o755 (8進数) = 493 (10進数)
    await invoke('set_file_permissions', { 
      path: '/path/to/script.sh', 
      mode: 0o755 
    });
    console.log('Permissions updated');
  } catch (error) {
    console.error('Failed to update permissions:', error);
  }
}

読み取り専用設定 (Windows/Mac/Linux)

全てのプラットフォームで動作する readonly 属性の切り替えです。

import { invoke } from '@tauri-apps/api/core';

async function makeReadOnly() {
  try {
    // 読み取り専用にする(書き込み禁止)
    await invoke('set_readonly', { 
      path: '/path/to/config.json', 
      readonly: true 
    });
    console.log('File is now read-only');
  } catch (error) {
    console.error('Error:', error);
  }
}

2. バックエンドから作成する (Rust)

Tauri のプラグイン機能では提供されていないため、Rust 側でカスタムコマンドを実装します。

パーミッション変更の実装

src-tauri/src/lib.rs (または main.rs) に記述します。

use tauri::command;
use std::fs;

#[cfg(unix)]
use std::os::unix::fs::PermissionsExt;

// Unix系向け: 数値でパーミッションを指定 (例: 0o755)
#[command]
fn set_file_permissions(path: String, mode: u32) -> Result<(), String> {
    let metadata = fs::metadata(&path).map_err(|e| e.to_string())?;
    let mut permissions = metadata.permissions();

    #[cfg(unix)]
    {
        permissions.set_mode(mode);
        fs::set_permissions(&path, permissions).map_err(|e| e.to_string())?;
        Ok(())
    }

    #[cfg(not(unix))]
    {
        Err("Custom permissions are only supported on Unix systems".to_string())
    }
}

// クロスプラットフォーム向け: 読み取り専用フラグの設定
#[command]
fn set_readonly(path: String, readonly: bool) -> Result<(), String> {
    let metadata = fs::metadata(&path).map_err(|e| e.to_string())?;
    let mut permissions = metadata.permissions();
    
    // trueなら書き込み禁止、falseなら書き込み許可
    permissions.set_readonly(readonly);
    
    fs::set_permissions(&path, permissions).map_err(|e| e.to_string())?;
    Ok(())
}

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .plugin(tauri_plugin_fs::init())
        .invoke_handler(tauri::generate_handler![
            set_file_permissions, 
            set_readonly
        ])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

補足

  • クロスプラットフォーム対応: chmod (mode) は Windows では動作しません。Windows をサポートする場合は set_readonly のアプローチを使用するか、OS 判定を行ってください。
  • 権限エラー: アプリケーションが管理者権限を持っていない場合、システムファイルや他ユーザーのファイルのパーミッションは変更できません。
  • セキュリティ: 任意のパスに対してパーミッション変更を許可すると、セキュリティリスクになります。Rust 側でパスのホワイトリストチェックなどを行うことを強く推奨します。