| Index: remoting/host/user_authenticator_pam.cc
|
| diff --git a/remoting/host/user_authenticator_pam.cc b/remoting/host/user_authenticator_pam.cc
|
| deleted file mode 100644
|
| index 5a45f4c37ceb7badcfd0ed77942c0159635281d6..0000000000000000000000000000000000000000
|
| --- a/remoting/host/user_authenticator_pam.cc
|
| +++ /dev/null
|
| @@ -1,106 +0,0 @@
|
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "remoting/host/user_authenticator_pam.h"
|
| -
|
| -#include <stdlib.h>
|
| -
|
| -#include <string>
|
| -
|
| -#include <security/pam_appl.h>
|
| -
|
| -namespace remoting {
|
| -
|
| -static const char kPamServiceName[] = "chromoting";
|
| -
|
| -UserAuthenticatorPam::UserAuthenticatorPam() {
|
| -}
|
| -
|
| -UserAuthenticatorPam::~UserAuthenticatorPam() {
|
| -}
|
| -
|
| -bool UserAuthenticatorPam::Authenticate(const std::string& username,
|
| - const std::string& password) {
|
| - username_ = username;
|
| - password_ = password;
|
| - pam_conv conversation;
|
| - conversation.conv = ConvFunction;
|
| - conversation.appdata_ptr = static_cast<void*>(this);
|
| - // TODO(lambroslambrou): Allow PAM service name to be configurable.
|
| - pam_handle_t* pam_handle;
|
| - if (pam_start(kPamServiceName, username_.c_str(),
|
| - &conversation, &pam_handle) != PAM_SUCCESS) {
|
| - return false;
|
| - }
|
| -
|
| - // TODO(lambroslambrou): Move to separate thread.
|
| - int pam_status = pam_authenticate(pam_handle, 0);
|
| - pam_end(pam_handle, pam_status);
|
| - return pam_status == PAM_SUCCESS;
|
| -}
|
| -
|
| -// static
|
| -int UserAuthenticatorPam::ConvFunction(int num_msg,
|
| - const pam_message** msg,
|
| - pam_response** resp,
|
| - void* appdata_ptr) {
|
| - if (num_msg <= 0)
|
| - return PAM_CONV_ERR;
|
| - UserAuthenticatorPam* user_auth =
|
| - static_cast<UserAuthenticatorPam*>(appdata_ptr);
|
| - // Must allocate with malloc(), as the calling PAM module will
|
| - // release the memory with free().
|
| - pam_response* resp_tmp = static_cast<pam_response*>(
|
| - malloc(num_msg * sizeof(pam_response)));
|
| - if (resp_tmp == NULL)
|
| - return PAM_CONV_ERR;
|
| -
|
| - bool raise_error = false;
|
| - // On exit from the loop, 'count' will hold the number of initialised items
|
| - // that the cleanup code needs to look at, in case of error.
|
| - int count;
|
| - for (count = 0; count < num_msg; count++) {
|
| - // Alias for readability.
|
| - pam_response* resp_item = &resp_tmp[count];
|
| - resp_item->resp_retcode = 0;
|
| - resp_item->resp = NULL;
|
| - switch (msg[count]->msg_style) {
|
| - case PAM_PROMPT_ECHO_ON:
|
| - resp_item->resp = strdup(user_auth->username_.c_str());
|
| - if (resp_item->resp == NULL)
|
| - raise_error = true;
|
| - break;
|
| - case PAM_PROMPT_ECHO_OFF:
|
| - resp_item->resp = strdup(user_auth->password_.c_str());
|
| - if (resp_item->resp == NULL)
|
| - raise_error = true;
|
| - break;
|
| - case PAM_TEXT_INFO:
|
| - // No response needed, as this instructs the PAM client to display
|
| - // text to the user. Leave as NULL and continue with next prompt.
|
| - break;
|
| - default:
|
| - // Unexpected style code, so abort.
|
| - raise_error = true;
|
| - }
|
| - if (raise_error)
|
| - break;
|
| - }
|
| -
|
| - if (raise_error) {
|
| - // Not passing the response back, so free up any memory used.
|
| - for (int n = 0; n < count; n++) {
|
| - if (resp_tmp[n].resp) {
|
| - free(resp_tmp[n].resp);
|
| - }
|
| - }
|
| - free(resp_tmp);
|
| - return PAM_CONV_ERR;
|
| - } else {
|
| - *resp = resp_tmp;
|
| - return PAM_SUCCESS;
|
| - }
|
| -}
|
| -
|
| -} // namespace remoting
|
|
|