summaryrefslogtreecommitdiffstats
path: root/src/files.rs
diff options
context:
space:
mode:
authorrabite <rabite@posteo.de>2019-03-20 15:49:41 +0100
committerrabite <rabite@posteo.de>2019-03-20 17:44:41 +0100
commit118aeac6e0e4a10b2728fd13920a2c6c3808a6ff (patch)
tree6c663984f0ea2c7a3c29b6f5a1ec5bdbf01bf5b3 /src/files.rs
parentd65ee9253d81d9d497a6d7f35566f3bcb7e0fcea (diff)
faster read permission checking
Diffstat (limited to 'src/files.rs')
-rw-r--r--src/files.rs34
1 files changed, 33 insertions, 1 deletions
diff --git a/src/files.rs b/src/files.rs
index 53f167a..2ea4512 100644
--- a/src/files.rs
+++ b/src/files.rs
@@ -9,7 +9,10 @@ use std::ffi::{OsStr, OsString};
use lscolors::LsColors;
use mime_detective;
-use users;
+use users::{get_current_username,
+ get_current_groupname,
+ get_user_by_uid,
+ get_group_by_gid};
use chrono::TimeZone;
use failure::Error;
use notify::DebouncedEvent;
@@ -553,6 +556,35 @@ impl File {
Ok(())
}
+ pub fn is_readable(&self) -> HResult<bool> {
+ let meta = self.meta()?;
+ let current_user = get_current_username()?.to_string_lossy().to_string();
+ let current_group = get_current_groupname()?.to_string_lossy().to_string();
+ let file_user = get_user_by_uid(meta.uid())?
+ .name()
+ .to_string_lossy()
+ .to_string();
+ let file_group = get_group_by_gid(meta.gid())?
+ .name()
+ .to_string_lossy()
+ .to_string();
+ let perms = meta.mode();
+
+ let user_readable = perms & 0o400;
+ let group_readable = perms & 0o040;
+ let other_readable = perms & 0o004;
+
+ if current_user == file_user && user_readable > 0 {
+ Ok(true)
+ } else if current_group == file_group && group_readable > 0 {
+ Ok(true)
+ } else if other_readable > 0 {
+ Ok(true)
+ } else {
+ Ok(false)
+ }
+ }
+
pub fn pretty_print_permissions(&self) -> HResult<String> {
let perms: usize = format!("{:o}", self.meta()?.mode()).parse().unwrap();
let perms: usize = perms % 800;