version 1.1.2.4, 2007/01/02 19:14:09
|
version 1.1.2.6, 2007/01/04 06:58:32
|
|
|
#include "Mutex.h" | #include "Mutex.h" |
#include "FileSystem.h" | #include "FileSystem.h" |
#include "String.h" | #include "String.h" |
#include <Pegasus/Security/Cimservera/Strlcpy.h> |
#include <Executor/Strlcpy.h> |
#include <Pegasus/Security/Cimservera/Strlcat.h> |
#include <Executor/Strlcat.h> |
| |
#if defined(PEGASUS_ENABLE_PRIVILEGE_SEPARATION) | #if defined(PEGASUS_ENABLE_PRIVILEGE_SEPARATION) |
# include <Executor/Executor.h> |
# include <Executor/Messages.h> |
#endif | #endif |
| |
#if defined(PEGASUS_PAM_AUTHENTICATION) | #if defined(PEGASUS_PAM_AUTHENTICATION) |
# include <Pegasus/Security/Cimservera/cimservera.h> |
# include <Executor/PAMAuth.h> |
#endif | #endif |
| |
PEGASUS_NAMESPACE_BEGIN | PEGASUS_NAMESPACE_BEGIN |
|
|
// _send request header: | // _send request header: |
| |
ExecutorRequestHeader header; | ExecutorRequestHeader header; |
header.code = EXECUTOR_PING_REQUEST; |
header.code = EXECUTOR_PING_MESSAGE; |
| |
if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) | if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
return -1; | return -1; |
|
|
// _send request header: | // _send request header: |
| |
ExecutorRequestHeader header; | ExecutorRequestHeader header; |
header.code = EXECUTOR_OPEN_FILE_REQUEST; |
header.code = EXECUTOR_OPEN_FILE_MESSAGE; |
| |
if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) | if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
return NULL; | return NULL; |
|
|
// _send request header: | // _send request header: |
| |
ExecutorRequestHeader header; | ExecutorRequestHeader header; |
header.code = EXECUTOR_RENAME_FILE_REQUEST; |
header.code = EXECUTOR_RENAME_FILE_MESSAGE; |
| |
if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) | if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
return -1; | return -1; |
|
|
// _send request header: | // _send request header: |
| |
ExecutorRequestHeader header; | ExecutorRequestHeader header; |
header.code = EXECUTOR_REMOVE_FILE_REQUEST; |
header.code = EXECUTOR_REMOVE_FILE_MESSAGE; |
| |
if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) | if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
return -1; | return -1; |
|
|
// _send request header: | // _send request header: |
| |
ExecutorRequestHeader header; | ExecutorRequestHeader header; |
header.code = EXECUTOR_START_PROVIDER_AGENT_REQUEST; |
header.code = EXECUTOR_START_PROVIDER_AGENT_MESSAGE; |
| |
if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) | if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
return -1; | return -1; |
|
|
// _send request header: | // _send request header: |
| |
ExecutorRequestHeader header; | ExecutorRequestHeader header; |
header.code = EXECUTOR_DAEMONIZE_EXECUTOR_REQUEST; |
header.code = EXECUTOR_DAEMONIZE_EXECUTOR_MESSAGE; |
| |
if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) | if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
return -1; | return -1; |
|
|
return response.status; | return response.status; |
} | } |
| |
static int OutOfProcess_changeOwner( |
static int OutOfProcess_waitPid( |
const char* path, |
int pid) |
const char* owner) |
|
{ | { |
AutoMutex autoMutex(_mutex); | AutoMutex autoMutex(_mutex); |
| |
// _send request header: | // _send request header: |
| |
ExecutorRequestHeader header; | ExecutorRequestHeader header; |
header.code = EXECUTOR_CHANGE_OWNER_REQUEST; |
header.code = EXECUTOR_WAIT_PID_MESSAGE; |
| |
if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) | if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
return -1; | return -1; |
| |
// _send request body: | // _send request body: |
| |
ExecutorChangeOwnerRequest request; |
ExecutorWaitPidRequest request; |
Strlcpy(request.path, path, sizeof(request.path)); |
request.pid = pid; |
Strlcpy(request.owner, owner, sizeof(request.owner)); |
|
| |
if (_send(_getSock(), &request, sizeof(request)) != sizeof(request)) | if (_send(_getSock(), &request, sizeof(request)) != sizeof(request)) |
return -1; | return -1; |
| |
// Receive the response | // Receive the response |
| |
ExecutorChangeOwnerResponse response; |
ExecutorWaitPidResponse response; |
| |
if (_recv(_getSock(), &response, sizeof(response)) != sizeof(response)) | if (_recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
return -1; | return -1; |
|
|
return response.status; | return response.status; |
} | } |
| |
static int OutOfProcess_waitPid( |
static int OutOfProcess_pamAuthenticate( |
int pid) |
const char* username, |
|
const char* password) |
{ | { |
AutoMutex autoMutex(_mutex); | AutoMutex autoMutex(_mutex); |
| |
// _send request header: | // _send request header: |
| |
ExecutorRequestHeader header; | ExecutorRequestHeader header; |
header.code = EXECUTOR_WAIT_PID_REQUEST; |
header.code = EXECUTOR_PAM_AUTHENTICATE_MESSAGE; |
| |
if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) | if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
return -1; | return -1; |
| |
// _send request body: |
// _send request body. |
| |
ExecutorWaitPidRequest request; |
ExecutorPAMAuthenticateRequest request; |
request.pid = pid; |
memset(&request, 0, sizeof(request)); |
|
Strlcpy(request.username, username, EXECUTOR_BUFFER_SIZE); |
|
Strlcpy(request.password, password, EXECUTOR_BUFFER_SIZE); |
| |
if (_send(_getSock(), &request, sizeof(request)) != sizeof(request)) | if (_send(_getSock(), &request, sizeof(request)) != sizeof(request)) |
return -1; | return -1; |
| |
// Receive the response | // Receive the response |
| |
ExecutorWaitPidResponse response; |
ExecutorPAMAuthenticateResponse response; |
| |
if (_recv(_getSock(), &response, sizeof(response)) != sizeof(response)) | if (_recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
return -1; | return -1; |
|
|
return response.status; | return response.status; |
} | } |
| |
static int OutOfProcess_pamAuthenticate( |
static int OutOfProcess_pamValidateUser( |
const char* username, |
const char* username) |
const char* password) |
|
{ | { |
AutoMutex autoMutex(_mutex); | AutoMutex autoMutex(_mutex); |
| |
// _send request header: | // _send request header: |
| |
ExecutorRequestHeader header; | ExecutorRequestHeader header; |
header.code = EXECUTOR_PAM_AUTHENTICATE_REQUEST; |
header.code = EXECUTOR_PAM_VALIDATE_USER_MESSAGE; |
| |
if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) | if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
return -1; | return -1; |
| |
// _send request body. | // _send request body. |
| |
ExecutorPAMAuthenticateRequest request; |
ExecutorPAMValidateUserRequest request; |
memset(&request, 0, sizeof(request)); | memset(&request, 0, sizeof(request)); |
Strlcpy(request.username, username, EXECUTOR_BUFFER_SIZE); | Strlcpy(request.username, username, EXECUTOR_BUFFER_SIZE); |
Strlcpy(request.password, password, EXECUTOR_BUFFER_SIZE); |
|
| |
if (_send(_getSock(), &request, sizeof(request)) != sizeof(request)) | if (_send(_getSock(), &request, sizeof(request)) != sizeof(request)) |
return -1; | return -1; |
| |
// Receive the response | // Receive the response |
| |
ExecutorPAMAuthenticateResponse response; |
ExecutorPAMValidateUserResponse response; |
| |
if (_recv(_getSock(), &response, sizeof(response)) != sizeof(response)) | if (_recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
return -1; | return -1; |
|
|
return response.status; | return response.status; |
} | } |
| |
static int OutOfProcess_pamValidateUser( |
int OutOfProcess_startLocalAuth( |
const char* username) |
const char* user, |
|
char path[EXECUTOR_BUFFER_SIZE], |
|
SessionKey* key) |
{ | { |
AutoMutex autoMutex(_mutex); | AutoMutex autoMutex(_mutex); |
| |
// _send request header: | // _send request header: |
| |
ExecutorRequestHeader header; | ExecutorRequestHeader header; |
header.code = EXECUTOR_PAM_VALIDATE_USER_REQUEST; |
header.code = EXECUTOR_START_LOCAL_AUTH_MESSAGE; |
| |
if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) | if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
return -1; | return -1; |
| |
// _send request body. | // _send request body. |
| |
ExecutorPAMValidateUserRequest request; |
ExecutorStartLocalAuthRequest request; |
memset(&request, 0, sizeof(request)); | memset(&request, 0, sizeof(request)); |
Strlcpy(request.username, username, EXECUTOR_BUFFER_SIZE); |
Strlcpy(request.user, user, EXECUTOR_BUFFER_SIZE); |
| |
if (_send(_getSock(), &request, sizeof(request)) != sizeof(request)) | if (_send(_getSock(), &request, sizeof(request)) != sizeof(request)) |
return -1; | return -1; |
| |
// Receive the response | // Receive the response |
| |
ExecutorPAMValidateUserResponse response; |
ExecutorStartLocalAuthResponse response; |
| |
if (_recv(_getSock(), &response, sizeof(response)) != sizeof(response)) | if (_recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
return -1; | return -1; |
| |
|
Strlcpy(key->data, response.key, sizeof(key->data)); |
|
Strlcpy(path, response.path, EXECUTOR_BUFFER_SIZE); |
|
|
|
return response.status; |
|
} |
|
|
|
int OutOfProcess_finishLocalAuth( |
|
const SessionKey* key, |
|
const char* token, |
|
SessionKey* newKey) |
|
{ |
|
AutoMutex autoMutex(_mutex); |
|
|
|
// _send request header: |
|
|
|
ExecutorRequestHeader header; |
|
header.code = EXECUTOR_FINISH_LOCAL_AUTH_MESSAGE; |
|
|
|
if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
|
return -1; |
|
|
|
// _send request body. |
|
|
|
ExecutorFinishLocalAuthRequest request; |
|
memset(&request, 0, sizeof(request)); |
|
Strlcpy(request.key, key->data, EXECUTOR_BUFFER_SIZE); |
|
Strlcpy(request.token, token, EXECUTOR_BUFFER_SIZE); |
|
|
|
if (_send(_getSock(), &request, sizeof(request)) != sizeof(request)) |
|
return -1; |
|
|
|
// Receive the response |
|
|
|
ExecutorFinishLocalAuthResponse response; |
|
|
|
if (_recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
|
return -1; |
|
|
|
Strlcpy(newKey->data, response.key, sizeof(newKey->data)); |
|
|
return response.status; | return response.status; |
} | } |
| |
|
|
_mutex.unlock(); | _mutex.unlock(); |
} | } |
| |
|
int Executor::detectExecutor() |
|
{ |
|
if (_getSock() == -1) |
|
return -1; |
|
else |
|
return 0; |
|
} |
|
|
int Executor::ping() | int Executor::ping() |
{ | { |
if (_getSock() == -1) | if (_getSock() == -1) |
|
|
#endif /* defined(PEGASUS_ENABLE_PRIVILEGE_SEPARATION) */ | #endif /* defined(PEGASUS_ENABLE_PRIVILEGE_SEPARATION) */ |
} | } |
| |
int Executor::changeOwner( |
|
const char* path, |
|
const char* owner) |
|
{ |
|
if (_getSock() == -1) |
|
return InProcess_changeOwner(path, owner); |
|
|
|
#if defined(PEGASUS_ENABLE_PRIVILEGE_SEPARATION) |
|
return OutOfProcess_changeOwner(path, owner); |
|
#else |
|
return -1; |
|
#endif /* defined(PEGASUS_ENABLE_PRIVILEGE_SEPARATION) */ |
|
} |
|
|
|
int Executor::waitPid( | int Executor::waitPid( |
int pid) | int pid) |
{ | { |
|
|
#endif /* defined(PEGASUS_ENABLE_PRIVILEGE_SEPARATION) */ | #endif /* defined(PEGASUS_ENABLE_PRIVILEGE_SEPARATION) */ |
} | } |
| |
|
int Executor::startLocalAuth( |
|
const char* user, |
|
char path[EXECUTOR_BUFFER_SIZE], |
|
SessionKey* key) |
|
{ |
|
if (_getSock() == -1) |
|
return -1; |
|
|
|
#if defined(PEGASUS_ENABLE_PRIVILEGE_SEPARATION) |
|
return OutOfProcess_startLocalAuth(user, path, key); |
|
#else |
|
return -1; |
|
#endif /* defined(PEGASUS_ENABLE_PRIVILEGE_SEPARATION) */ |
|
} |
|
|
|
int Executor::finishLocalAuth( |
|
const SessionKey* key, |
|
const char* token, |
|
SessionKey* newKey) |
|
{ |
|
if (_getSock() == -1) |
|
return -1; |
|
|
|
#if defined(PEGASUS_ENABLE_PRIVILEGE_SEPARATION) |
|
return OutOfProcess_finishLocalAuth(key, token, newKey); |
|
#else |
|
return -1; |
|
#endif /* defined(PEGASUS_ENABLE_PRIVILEGE_SEPARATION) */ |
|
} |
|
|
PEGASUS_NAMESPACE_END | PEGASUS_NAMESPACE_END |