diff options
author | David Lindbom <hi@davidlindbom.se> | 2021-12-11 17:23:20 +0100 |
---|---|---|
committer | Brian Gianforcaro <b.gianfo@gmail.com> | 2021-12-11 13:16:55 -0800 |
commit | 235a2b35d68117611b617776003d587bf2fdc722 (patch) | |
tree | 407d032e6bbf0c3c04e84c6e95eaed26bf6402ae /Userland/Utilities | |
parent | e34eb3e36d880d40a1e10a19dfa3f74e5d50c43c (diff) | |
download | serenity-235a2b35d68117611b617776003d587bf2fdc722.zip |
passwd: Port to LibMain
Diffstat (limited to 'Userland/Utilities')
-rw-r--r-- | Userland/Utilities/CMakeLists.txt | 2 | ||||
-rw-r--r-- | Userland/Utilities/passwd.cpp | 67 |
2 files changed, 20 insertions, 49 deletions
diff --git a/Userland/Utilities/CMakeLists.txt b/Userland/Utilities/CMakeLists.txt index 0c937232f3..169be83bf8 100644 --- a/Userland/Utilities/CMakeLists.txt +++ b/Userland/Utilities/CMakeLists.txt @@ -101,7 +101,7 @@ target_link_libraries(notify LibGUI) target_link_libraries(nproc LibMain) target_link_libraries(open LibDesktop) target_link_libraries(pape LibGUI) -target_link_libraries(passwd LibCrypt) +target_link_libraries(passwd LibCrypt LibMain) target_link_libraries(paste LibGUI) target_link_libraries(pgrep LibRegex) target_link_libraries(pls LibCrypt) diff --git a/Userland/Utilities/passwd.cpp b/Userland/Utilities/passwd.cpp index 5d5e954333..0b0c76e052 100644 --- a/Userland/Utilities/passwd.cpp +++ b/Userland/Utilities/passwd.cpp @@ -9,10 +9,12 @@ #include <LibCore/Account.h> #include <LibCore/ArgsParser.h> #include <LibCore/GetPassword.h> +#include <LibCore/System.h> +#include <LibMain/Main.h> #include <string.h> #include <unistd.h> -int main(int argc, char** argv) +ErrorOr<int> serenity_main(Main::Arguments arguments) { if (geteuid() != 0) { warnln("Not running as root :^("); @@ -24,17 +26,9 @@ int main(int argc, char** argv) return 1; } - if (pledge("stdio wpath rpath cpath fattr tty", nullptr) < 0) { - perror("pledge"); - return 1; - } - - if (unveil("/etc", "rwc") < 0) { - perror("unveil"); - return 1; - } - - unveil(nullptr, nullptr); + TRY(Core::System::pledge("stdio wpath rpath cpath fattr tty")); + TRY(Core::System::unveil("/etc", "rwc")); + TRY(Core::System::unveil(nullptr, nullptr)); bool del = false; bool lock = false; @@ -48,24 +42,17 @@ int main(int argc, char** argv) args_parser.add_option(unlock, "Unlock password", "unlock", 'u'); args_parser.add_positional_argument(username, "Username", "username", Core::ArgsParser::Required::No); - args_parser.parse(argc, argv); + args_parser.parse(arguments); uid_t current_uid = getuid(); - auto account_or_error = (username) - ? Core::Account::from_name(username) - : Core::Account::from_uid(current_uid); - - if (account_or_error.is_error()) { - warnln("Core::Account::{}: {}", (username) ? "from_name" : "from_uid", account_or_error.error()); - return 1; - } + // target_account is the account we are changing the password of. + auto target_account = TRY((username) + ? Core::Account::from_name(username) + : Core::Account::from_uid(current_uid)); setpwent(); - // target_account is the account we are changing the password of. - auto& target_account = account_or_error.value(); - if (current_uid != 0 && current_uid != target_account.uid()) { warnln("You can't modify passwd for {}", username); return 1; @@ -79,50 +66,34 @@ int main(int argc, char** argv) target_account.set_password_enabled(true); } else { if (current_uid != 0) { - auto current_password = Core::get_password("Current password: "); - if (current_password.is_error()) { - warnln("{}", current_password.error()); - return 1; - } + auto current_password = TRY(Core::get_password("Current password: ")); - if (!target_account.authenticate(current_password.value())) { + if (!target_account.authenticate(current_password)) { warnln("Incorrect or disabled password."); warnln("Password for user {} unchanged.", target_account.username()); return 1; } } - auto new_password = Core::get_password("New password: "); - if (new_password.is_error()) { - warnln("{}", new_password.error()); - return 1; - } - - auto new_password_retype = Core::get_password("Retype new password: "); - if (new_password_retype.is_error()) { - warnln("{}", new_password_retype.error()); - return 1; - } + auto new_password = TRY(Core::get_password("New password: ")); + auto new_password_retype = TRY(Core::get_password("Retype new password: ")); - if (new_password.value().is_empty() && new_password_retype.value().is_empty()) { + if (new_password.is_empty() && new_password_retype.is_empty()) { warnln("No password supplied."); warnln("Password for user {} unchanged.", target_account.username()); return 1; } - if (new_password.value().view() != new_password_retype.value().view()) { + if (new_password.view() != new_password_retype.view()) { warnln("Sorry, passwords don't match."); warnln("Password for user {} unchanged.", target_account.username()); return 1; } - target_account.set_password(new_password.value()); + target_account.set_password(new_password); } - if (pledge("stdio wpath rpath cpath fattr", nullptr) < 0) { - perror("pledge"); - return 1; - } + TRY(Core::System::pledge("stdio wpath rpath cpath fattr")); if (!target_account.sync()) { perror("Core::Account::Sync"); |