00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00036 #include "OW_config.h"
00037 #include "OW_Exec.hpp"
00038 #include "OW_ConfigOpts.hpp"
00039 #include "OW_String.hpp"
00040 #include "OW_AuthenticatorIFC.hpp"
00041 #include "OW_Array.hpp"
00042 #if defined(OW_HAVE_SYS_WAIT_H) && defined(OW_WIFEXITED_NEEDS_WAIT_H)
00043 #include <sys/wait.h>
00044 #endif
00045 
00046 #include <string.h>
00047 
00048 namespace OW_NAMESPACE
00049 {
00050 
00051 class LinuxPAMAuthenticationCL : public AuthenticatorIFC
00052 {
00066 private:
00067    virtual bool doAuthenticate(String &userName, const String &info, String &details, OperationContext& context);
00068    
00069    virtual void doInit(ServiceEnvironmentIFCRef env);
00070    String m_allowedUsers;
00071    String m_libexecdir;
00072 };
00074 bool
00075 LinuxPAMAuthenticationCL::doAuthenticate(String &userName,
00076    const String &info, String &details, OperationContext& context)
00077 {
00078    if (info.empty())
00079    {
00080       details = "You must authenticate to access this resource";
00081       return false;
00082    }
00083    Array<String> allowedUsers = m_allowedUsers.tokenize();
00084    bool nameFound = false;
00085    for (size_t i = 0; i < allowedUsers.size(); i++)
00086    {
00087       if (allowedUsers[i].equals(userName))
00088       {
00089          nameFound = true;
00090          break;
00091       }
00092    }
00093    if (!nameFound)
00094    {
00095       return false;
00096    }
00097    String pathToPamAuth = m_libexecdir + "/PAMAuth";
00098    Array<String> commandLine;
00099    commandLine.push_back(pathToPamAuth);
00100    String output;
00101    int status = -1;
00102    int timeoutSecs = 60;
00103    int outputLimit = 1024;
00104    String input = userName + " " + info + "\n";
00105    try
00106    {
00107       Exec::executeProcessAndGatherOutput(commandLine, output, status, timeoutSecs, outputLimit, input);
00108    }
00109    catch (Exception& e)
00110    {
00111       return false;
00112    }
00113 
00114    if (WIFEXITED(status) && WEXITSTATUS(status) == 0)
00115    {
00116       return true;
00117    }
00118    return false;
00119 }
00120 void
00121 LinuxPAMAuthenticationCL::doInit(ServiceEnvironmentIFCRef env)
00122 {
00123    m_allowedUsers = env->getConfigItem(ConfigOpts::PAM_ALLOWED_USERS_opt);
00124    m_libexecdir = env->getConfigItem(ConfigOpts::LIBEXECDIR_opt, OW_DEFAULT_OWLIBEXECDIR);
00125 }
00126 
00127 } 
00128 
00130 OW_AUTHENTICATOR_FACTORY(OpenWBEM::LinuxPAMAuthenticationCL,pamcl);
00131