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