summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--special-mode-mgr/CMakeLists.txt4
-rw-r--r--special-mode-mgr/cmake/FindPAM.cmake71
-rw-r--r--special-mode-mgr/src/specialmodemgr.cpp74
3 files changed, 7 insertions, 142 deletions
diff --git a/special-mode-mgr/CMakeLists.txt b/special-mode-mgr/CMakeLists.txt
index 6fe7f86..fa69da8 100644
--- a/special-mode-mgr/CMakeLists.txt
+++ b/special-mode-mgr/CMakeLists.txt
@@ -1,6 +1,5 @@
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
project(specialmodemgr CXX)
-set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")
@@ -39,15 +38,12 @@ link_directories(${DBUSINTERFACE_LIBRARY_DIRS})
find_package(PkgConfig REQUIRED)
pkg_check_modules(LOGGING phosphor-logging REQUIRED)
-find_package(PAM REQUIRED)
-
add_executable(${PROJECT_NAME} ${SRC_FILES})
target_link_libraries(${PROJECT_NAME} systemd)
target_link_libraries(${PROJECT_NAME} ${SDBUSPLUSPLUS_LIBRARIES})
target_link_libraries(${PROJECT_NAME} ${DBUSINTERFACE_LIBRARIES})
target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES})
target_link_libraries(${PROJECT_NAME} phosphor_logging)
-target_link_libraries(${PROJECT_NAME} pam)
link_directories(${EXTERNAL_INSTALL_LOCATION}/lib)
diff --git a/special-mode-mgr/cmake/FindPAM.cmake b/special-mode-mgr/cmake/FindPAM.cmake
deleted file mode 100644
index 25307bd..0000000
--- a/special-mode-mgr/cmake/FindPAM.cmake
+++ /dev/null
@@ -1,71 +0,0 @@
-# - Try to find the PAM libraries
-# Once done this will define
-#
-# PAM_FOUND - system has pam
-# PAM_INCLUDE_DIR - the pam include directory
-# PAM_LIBRARIES - libpam library
-
-if (PAM_INCLUDE_DIR AND PAM_LIBRARY)
- # Already in cache, be silent
- set(PAM_FIND_QUIETLY TRUE)
-endif (PAM_INCLUDE_DIR AND PAM_LIBRARY)
-
-find_path(PAM_INCLUDE_DIR NAMES security/pam_appl.h pam/pam_appl.h)
-find_library(PAM_LIBRARY pam)
-find_library(DL_LIBRARY dl)
-
-if (PAM_INCLUDE_DIR AND PAM_LIBRARY)
- set(PAM_FOUND TRUE)
- if (DL_LIBRARY)
- set(PAM_LIBRARIES ${PAM_LIBRARY} ${DL_LIBRARY})
- else (DL_LIBRARY)
- set(PAM_LIBRARIES ${PAM_LIBRARY})
- endif (DL_LIBRARY)
-
- if (EXISTS ${PAM_INCLUDE_DIR}/pam/pam_appl.h)
- # darwin claims to be something special
- set(HAVE_PAM_PAM_APPL_H 1)
- endif (EXISTS ${PAM_INCLUDE_DIR}/pam/pam_appl.h)
-
- if (NOT DEFINED PAM_MESSAGE_CONST)
- include(CheckCXXSourceCompiles)
- # XXX does this work with plain c?
- check_cxx_source_compiles("
-#if ${HAVE_PAM_PAM_APPL_H}+0
-# include <pam/pam_appl.h>
-#else
-# include <security/pam_appl.h>
-#endif
-static int PAM_conv(
- int num_msg,
- const struct pam_message **msg, /* this is the culprit */
- struct pam_response **resp,
- void *ctx)
-{
- return 0;
-}
-int main(void)
-{
- struct pam_conv PAM_conversation = {
- &PAM_conv, /* this bombs out if the above does not match */
- 0
- };
- return 0;
-}
-" PAM_MESSAGE_CONST)
- endif (NOT DEFINED PAM_MESSAGE_CONST)
- set(PAM_MESSAGE_CONST ${PAM_MESSAGE_CONST} CACHE BOOL "PAM expects a conversation function with const pam_message")
-
-endif (PAM_INCLUDE_DIR AND PAM_LIBRARY)
-
-if (PAM_FOUND)
- if (NOT PAM_FIND_QUIETLY)
- message(STATUS "Found PAM: ${PAM_LIBRARIES}")
- endif (NOT PAM_FIND_QUIETLY)
-else (PAM_FOUND)
- if (PAM_FIND_REQUIRED)
- message(FATAL_ERROR "PAM was not found")
- endif(PAM_FIND_REQUIRED)
-endif (PAM_FOUND)
-
-mark_as_advanced(PAM_INCLUDE_DIR PAM_LIBRARY DL_LIBRARY PAM_MESSAGE_CONST)
diff --git a/special-mode-mgr/src/specialmodemgr.cpp b/special-mode-mgr/src/specialmodemgr.cpp
index 61c1d8a..6e7361f 100644
--- a/special-mode-mgr/src/specialmodemgr.cpp
+++ b/special-mode-mgr/src/specialmodemgr.cpp
@@ -17,7 +17,6 @@
#include "specialmodemgr.hpp"
#include "file.hpp"
-#include <security/pam_appl.h>
#include <sys/sysinfo.h>
#include <pwd.h>
@@ -52,62 +51,12 @@ namespace secCtrl = sdbusplus::xyz::openbmc_project::Control::Security::server;
#ifdef BMC_VALIDATION_UNSECURE_FEATURE
-static int pamFunctionConversation(int numMsg, const struct pam_message** msg,
- struct pam_response** resp, void* appdataPtr)
-{
- if (appdataPtr == nullptr)
- {
- return PAM_AUTH_ERR;
- }
- size_t passSize = std::strlen(reinterpret_cast<char*>(appdataPtr)) + 1;
- char* pass = reinterpret_cast<char*>(malloc(passSize));
- std::strncpy(pass, reinterpret_cast<char*>(appdataPtr), passSize);
-
- *resp = reinterpret_cast<pam_response*>(
- calloc(numMsg, sizeof(struct pam_response)));
-
- for (int i = 0; i < numMsg; ++i)
- {
- if (msg[i]->msg_style != PAM_PROMPT_ECHO_OFF)
- {
- continue;
- }
- resp[i]->resp = pass;
- }
- return PAM_SUCCESS;
-}
-
-int pamUpdatePasswd(const char* username, const char* password)
-{
- const struct pam_conv localConversation = {pamFunctionConversation,
- const_cast<char*>(password)};
- pam_handle_t* localAuthHandle = NULL; // this gets set by pam_start
-
- int retval =
- pam_start("passwd", username, &localConversation, &localAuthHandle);
-
- if (retval != PAM_SUCCESS)
- {
- return retval;
- }
-
- retval = pam_chauthtok(localAuthHandle, PAM_SILENT);
- if (retval != PAM_SUCCESS)
- {
- pam_end(localAuthHandle, retval);
- return retval;
- }
-
- return pam_end(localAuthHandle, PAM_SUCCESS);
-}
-
static void checkAndConfigureSpecialUser()
{
std::array<char, 4096> sbuffer{};
struct spwd spwd;
struct spwd* resultPtr = nullptr;
constexpr const char* specialUser = "root";
- constexpr const char* specialUserDefPasswd = "0penBmc1";
// Query shadow entry for special user.
int status = getspnam_r(specialUser, &spwd, sbuffer.data(),
@@ -117,22 +66,10 @@ static void checkAndConfigureSpecialUser()
phosphor::logging::log<phosphor::logging::level::ERR>(
"Error in querying shadow entry for special user");
}
- // Encrypted Password may be NULL or single character '!' if user is
- // disabled
- if (resultPtr->sp_pwdp[0] == 0 || resultPtr->sp_pwdp[1] == 0)
+ // Password will be single character '!' or '*' for disabled login
+ if ((resultPtr->sp_pwdp[0] == '!' || resultPtr->sp_pwdp[0] == '*') &&
+ resultPtr->sp_pwdp[1] == 0)
{
- pamUpdatePasswd(specialUser, specialUserDefPasswd);
- // requery the special user shadow entry as there is password
- // update.
- resultPtr = nullptr;
- status = getspnam_r(specialUser, &spwd, sbuffer.data(),
- sbuffer.max_size(), &resultPtr);
- if (status || (&spwd != resultPtr))
- {
- phosphor::logging::log<phosphor::logging::level::ERR>(
- "Error in querying shadow entry for special user");
- }
- // Mark the password as expired to force update the password
File passwdFd("/etc/shadow", "r+");
if ((passwdFd)() == nullptr)
{
@@ -140,8 +77,11 @@ static void checkAndConfigureSpecialUser()
"Error in opening shadow file");
return;
}
+ // Mark the special user password as null, to allow
+ // nullok login.
+ resultPtr->sp_pwdp[0] = 0;
// Mark the special user password as expired. This will
- // force the user to set new password on first login.
+ // force user to update new password on first login.
resultPtr->sp_lstchg = 0;
putspent(resultPtr, (passwdFd)());
phosphor::logging::log<phosphor::logging::level::INFO>(