From 02d6b09587b84500cc1aab0774c2479ca763dee9 Mon Sep 17 00:00:00 2001 From: libaoshan Date: Fri, 12 Sep 2025 10:35:56 +0800 Subject: [PATCH] update sudo transaction Signed-off-by: libaoshan --- sudo/src/main.cpp | 106 +++++++++++----------------------------------- 1 file changed, 24 insertions(+), 82 deletions(-) diff --git a/sudo/src/main.cpp b/sudo/src/main.cpp index 7340f791..da8809aa 100644 --- a/sudo/src/main.cpp +++ b/sudo/src/main.cpp @@ -39,7 +39,6 @@ #define PATH "PATH=" using namespace OHOS::UserIam; using namespace OHOS::AccountSA; -using namespace OHOS::UserIam::PinAuth; using namespace OHOS::UserIam::UserAuth; static FILE *g_ttyFp = nullptr; @@ -219,29 +218,7 @@ static char **ParseCmd(int argc, char* argv[], char* env[], char *cmd, int cmdLe return argvTmp; } -static void GetUserPwd(char *pwdBuf, int bufLen) -{ - const char *prompts = "[sudo] password for current user:"; - const char *newline = "\n"; - struct termios oldTerm; - struct termios newTerm; - - WriteTty(prompts); - - tcgetattr(STDIN_FILENO, &oldTerm); - newTerm = oldTerm; - newTerm.c_lflag &= ~(ECHO); - tcsetattr(STDIN_FILENO, TCSANOW, &newTerm); - (void)fgets(pwdBuf, bufLen, stdin); - if (pwdBuf[strlen(pwdBuf) - 1] == '\n') { - pwdBuf[strlen(pwdBuf) - 1] = '\0'; - } - tcsetattr(STDIN_FILENO, TCSANOW, &oldTerm); - - WriteTty(newline); -} - -static bool SetUidGid(void) +static bool SetUidGid() { if (setuid(0) != 0) { return false; @@ -255,12 +232,6 @@ static bool SetUidGid(void) return true; } -static void WaitForAuth(void) -{ - std::unique_lock lock(g_mutexForAuth); - g_condVarForAuth.wait(lock, [] { return g_authFinish; }); -} - static bool GetChallenge() { int32_t res = InitChallengeForCommand(g_challenge.data(), g_challenge.size()); @@ -271,27 +242,6 @@ static bool GetChallenge() return true; } -static bool VerifyAccount() -{ - bool verifyResult = false; - - UserAuthClient &sudoIAMClient = UserAuthClient::GetInstance(); - std::shared_ptr callback = std::make_shared(); - - OHOS::UserIam::UserAuth::AuthParam authParam; - authParam.userId = g_userId; - authParam.challenge = g_challenge; - authParam.authType = AuthType::PIN; - authParam.authTrustLevel = AuthTrustLevel::ATL1; - - sudoIAMClient.BeginAuthentication(authParam, callback); - std::shared_ptr sudoCallback = std::static_pointer_cast(callback); - WaitForAuth(); - verifyResult = sudoCallback->GetVerifyResult(); - g_authToken = sudoCallback->GetAuthToken(); - return verifyResult; -} - static bool GetUserId() { std::vector ids; @@ -306,43 +256,35 @@ static bool GetUserId() return true; } -static bool UserAccountVerify(char *pwd, int pwdLen) +static bool Verify() { - bool verifyResult = false; - std::shared_ptr inputer = nullptr; - - inputer = std::make_shared(); - std::shared_ptr sudoInputer = std::static_pointer_cast(inputer); - sudoInputer->SetPasswd(pwd, pwdLen); - if (!PinAuthRegister::GetInstance().RegisterInputer(inputer)) { - WriteStdErr("register pin inputer failed\n"); - return false; - } - - if (VerifyAccount()) { - verifyResult = true; - } - - PinAuthRegister::GetInstance().UnRegisterInputer(); - return verifyResult; -} - -static bool VerifyUserPin() -{ - char passwd[PWD_BUF_LEN] = {0}; - bool pwdVerifyResult = false; - if (getuid() == 0) { return true; } - GetUserPwd(passwd, PWD_BUF_LEN); - pwdVerifyResult = UserAccountVerify(passwd, strnlen(passwd, PWD_BUF_LEN)); - (void)memset_s(passwd, sizeof(passwd), 0, sizeof(passwd)); - if (!pwdVerifyResult) { + UserAuthClient &sudoIAMClient = UserAuthClient::GetInstance(); + std::shared_ptr callback = std::make_shared(); + + OHOS::UserIam::UserAuth::WidgetAuthParam authParam; + authParam.authTrustLevel = AuthTrustLevel::ATL1; + authParam.challenge = g_challenge; + authParam.userId = g_userId; + authParam.authTypes = { AuthType::PIN }; + //authParam.reuseUnlockResult + + OHOS::UserIam::UserAuth::WidgetParam widgetParam; + widgetParam.title = " "; + widgetParam.windowMode = OHOS::UserIam::UserAuth::WindowModeType::UNKNOWN_WINDOW_MODE; + sudoIAMClient.BeginWidgetAuth(authParam, widgetParam, callback); + std::shared_ptr sudoCallback = std::static_pointer_cast(callback); + std::unique_lock lock(g_mutexForAuth); + g_condVarForAuth.wait(lock, [] { return g_authFinish; }); + bool verifyResult = sudoCallback->GetVerifyResult(); + g_authToken = sudoCallback->GetAuthToken(); + if (!verifyResult) { WriteTty(USER_VERIFY_FAILED); } - return pwdVerifyResult; + return verifyResult; } static bool SetPSL() @@ -397,7 +339,7 @@ int main(int argc, char* argv[], char* env[]) return 1; } - if (!VerifyUserPin()) { + if (!Verify()) { return 1; } -- Gitee