[![Cargo](https://img.shields.io/crates/v/faccess.svg)][crate]
[![Documentation](https://docs.rs/faccess/badge.svg)][docs]
[![CI](https://github.com/Freaky/faccess/workflows/build/badge.svg)][ci]
# faccess
Basic cross-platform file accessibility checks for Rust.
## Synopsis
```rust
pub trait PathExt {
fn access(&self, mode: AccessMode) -> std::io::Result<()>;
fn readable(&self) -> bool;
fn writable(&self) -> bool;
fn executable(&self) -> bool;
}
impl PathExt for std::path::Path;
```
## Description
`faccess` provides an extension trait for `std::path::Path` which adds an
`access` method for checking the accessibility of a path for the given access
permissions — a bitwise-inclusive OR of one or more `AccessMode` flags
(`EXISTS`, `READ`, `WRITE`, `EXECUTE`).
It also provides convenience methods `readable`, `writable`, and `executable`
if only a single permission needs to be checked in a simple boolean fashion.
## Example
```rust
use std::path::Path;
use faccess::{AccessMode, PathExt};
let path = Path::new("/bin/ls");
assert!(!path.writable());
assert!(path.executable());
```
## Platform-specific Behaviour
On Unix platforms, `access` directly maps to [`faccessat(2)`], with the
`AT_EACCESS` flag used where available to test against the effective user and
group ID's.
On Windows, a complex custom implementation is used to approximate these
semantics in a best-effort fashion, using a mixture of file extension checks,
simply attempting to open a file, [`GetNamedSecurityInfoW`], and [`AccessCheck`],
depending on the permissions being checked. This is similar to implementations
found in other languages.
On other platforms it simply proxies to `exists()` and `readonly()` as appropriate.
## Caveats
There is a history of time-of-check to time-of-use ([TOCTOU]) bugs with this
class of function, particularly with set-user-ID programs relying on them to
validate effective user/group permissions prior to accessing files on behalf
of other users. They should not be relied upon in a security context.
[`faccessat(2)`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/access.html
[`GetNamedSecurityInfoW`]: https://docs.microsoft.com/en-us/windows/win32/api/aclapi/nf-aclapi-getnamedsecurityinfow
[`AccessCheck`]: https://docs.microsoft.com/en-us/windows/win32/api/securitybaseapi/nf-securitybaseapi-accesscheck
[TOCTOU]: https://en.wikipedia.org/wiki/Time-of-check_to_time-of-use
[crate]: https://crates.io/crates/faccess
[docs]: https://docs.rs/faccess
[ci]: https://github.com/Freaky/faccess/actions?query=workflow%3Abuild