From 313c9edfd0aa9399fcb8b0489e79fbc4706a3d38 Mon Sep 17 00:00:00 2001 From: Luka Vandervelden Date: Sun, 17 Nov 2019 19:05:22 +0100 Subject: [PATCH] Improved user and group removal, simpler APIs. --- src/passwd.cr | 66 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 24 deletions(-) diff --git a/src/passwd.cr b/src/passwd.cr index 8e5b2e6..1c00c32 100644 --- a/src/passwd.cr +++ b/src/passwd.cr @@ -56,9 +56,9 @@ class Passwd false end - def get_user(uid : Int32) : Passwd::User? + def get_user(&block) : Passwd::User? each_user do |user| - if user.uid == uid + if yield user set_user_groups user return user @@ -66,21 +66,24 @@ class Passwd end end + def get_user(uid : Int32) + get_user &.uid.==(uid) + end + + def get_user(login : String) + get_user &.login.==(login) + end + ## # Will fail if the user is found but the password is invalid. - def get_user(login : String, password : String) : Passwd::User? + # Use this method if you somehow need to check the password… + # Be careful though, your system probably does not use SHA256 hashes as + # passwords. You should use this only on your own passwd and group files. + def get_user(login : String, password : String) hash = Passwd.hash_password password - each_user do |user| - if user.login == login - if user.password_hash == hash - set_user_groups user - - return user - end - - next - end + get_user do |user| + user.login == login && user.password_hash == hash end end @@ -201,27 +204,26 @@ class Passwd FileUtils.cp tempfile.path, path end - def remove_user(uid) - user = get_user(uid) - - return nil unless user - - user_login = user.login - + def remove_user_from_groups(user) new_group = group_as_array.map do |line| group = Group.new line - group.users.select! &.!=(user_login) + group.users.select! &.!=(user.login) + group.users.select! &.!=(user.uid.to_s) group.to_csv end safe_rewrite @group, new_group.join('\n') + '\n' + end + def remove_user(&block) new_passwd = passwd_as_array.compact_map do |line| user = User.new line - if uid == user.uid + if yield user + remove_user_from_groups user + nil else line.join ':' @@ -231,11 +233,19 @@ class Passwd safe_rewrite @passwd, new_passwd.join("\n") + "\n" end - def remove_group(gid) + def remove_user(uid : Int32) + remove_user &.uid.==(uid) + end + + def remove_user(login : String) + remove_user &.login.==(login) + end + + def remove_group(&block) new_group = group_as_array.compact_map do |line| group = Group.new line - if gid == group.gid + if yield group nil else line.join ':' @@ -244,5 +254,13 @@ class Passwd safe_rewrite @group, new_group.join('\n') + '\n' end + + def remove_group(gid : Int32) + remove_group &.gid.==(gid) + end + + def remove_group(name : String) + remove_group &.name.==(name) + end end