2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Use is subject to license terms.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * BSD 3 Clause License
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Copyright (c) 2007, The Storage Networking Industry Association.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Redistribution and use in source and binary forms, with or without
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * modification, are permitted provided that the following conditions
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * are met:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Redistributions of source code must retain the above copyright
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * notice, this list of conditions and the following disclaimer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Redistributions in binary form must reproduce the above copyright
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * notice, this list of conditions and the following disclaimer in
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the documentation and/or other materials provided with the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * distribution.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Neither the name of The Storage Networking Industry Association (SNIA)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nor the names of its contributors may be used to endorse or promote
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * products derived from this software without specific prior written
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * permission.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * POSSIBILITY OF SUCH DAMAGE.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Copyright (c) 2007, The Storage Networking Industry Association. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Copyright (c) 1996, 1997 PDC, Network Appliance. All Rights Reserved */
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl/* Copyright 2014 Nexenta Systems, Inc. All rights reserved. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/types.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <errno.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <pwd.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/socket.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <netinet/in.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/queue.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <arpa/inet.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <md5.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <shadow.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <crypt.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <alloca.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include "ndmpd_common.h"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include "ndmpd.h"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <libndmp.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <ndmpd_door.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <security/pam_appl.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int ndmpd_connect_auth_text(char *uname, char *auth_id,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *auth_password);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int ndmpd_connect_auth_md5(char *uname, char *auth_id, char *auth_digest,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned char *auth_challenge);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic struct conn_list *ndmp_connect_list_find(ndmp_connection_t *connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void create_md5_digest(unsigned char *digest, char *passwd,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned char *challenge);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic struct conn_list *ndmp_connect_list_find_id(int id);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* routines for connection info */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid ndmp_connect_list_get(ndmp_door_ctx_t *enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void connection_get(struct conn_list *clp, ndmp_door_ctx_t *enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void ndmp_connect_get_conn(struct conn_list *clp,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_ctx_t *enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void ndmp_connect_get_v2(ndmp_connection_t *connection,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_ctx_t *enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void ndmp_connect_get_scsi_v2(ndmpd_session_t *session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_ctx_t *enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void ndmp_connect_get_tape_v2(ndmpd_session_t *session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_ctx_t *enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void ndmp_connect_get_mover_v2(ndmpd_session_t *session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_ctx_t *enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void ndmp_connect_get_data_v2(ndmpd_session_t *session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_ctx_t *enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void ndmp_connect_get_v3(ndmp_connection_t *connection,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_ctx_t *enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void ndmp_connect_get_mover_v3(ndmpd_session_t *session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_ctx_t *enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void ndmp_connect_get_data_v3(ndmpd_session_t *session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_ctx_t *enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid ndmpd_get_devs(ndmp_door_ctx_t *enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#ifndef LIST_FOREACH
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define LIST_FOREACH(var, head, field) \
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for ((var) = (head)->lh_first; (var); (var) = (var)->field.le_next)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#endif /* LIST_FOREACH */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * List of active connections.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstruct conn_list {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar LIST_ENTRY(conn_list) cl_q;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int cl_id;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connection_t *cl_conn;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar};
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza SabdarLIST_HEAD(cl_head, conn_list);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Head of the active connections.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic struct cl_head cl_head;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarmutex_t cl_mutex = DEFAULTMUTEX;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Set this variable to non-zero to print verbose information.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint ndmp_connect_print_verbose = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMP V2 HANDLERS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_connect_open_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This handler sets the protocol version to be used on the connection.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_connect_open_v2(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_open_request *request = (ndmp_connect_open_request *)body;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_open_reply reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!(session = (ndmpd_session_t *)ndmp_get_client_data(connection)))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_mover.md_state != NDMP_MOVER_STATE_IDLE ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_state != NDMP_DATA_STATE_IDLE)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_STATE_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else if (request->protocol_version > ndmp_ver)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_ARGS_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, (void *) &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending connect_open reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Set the protocol version.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Must wait until after sending the reply since the reply
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * must be sent using the same protocol version that was used
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * to process the request.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (reply.error == NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "set ver to: %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request->protocol_version);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_set_version(connection, request->protocol_version);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_protocol_version = request->protocol_version;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_connect_client_auth_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This handler authorizes the NDMP connection.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * msginfo (input) - request message.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_connect_client_auth_v2(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_client_auth_request *request;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_client_auth_reply reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_auth_text *auth;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_auth_md5 *md5;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned char md5_digest[16];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *passwd, *dec_passwd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *uname;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request = (ndmp_connect_client_auth_request *)body;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "auth_type:%s",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request->auth_data.auth_type == NDMP_AUTH_NONE ? "None" :
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (request->auth_data.auth_type == NDMP_AUTH_TEXT ? "Text" :
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (request->auth_data.auth_type == NDMP_AUTH_MD5 ? "MD5" :
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Invalid")));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (request->auth_data.auth_type) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_AUTH_NONE:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Allow no authorization for development.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Comment the following for a non-secure production server.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Authorization denied.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Authorization type should be md5 or cleartext.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_ARGS_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_audit_connect(connection, EINVAL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_AUTH_TEXT:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* Check authorization. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((uname = ndmpd_get_prop(NDMP_CLEARTEXT_USERNAME)) == NULL ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *uname == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Authorization denied.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "User name is not set at server.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NOT_AUTHORIZED_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_set_authorized(connection, FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, (void *) &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending ndmp_connect_client_auth reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_audit_connect(connection,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ADT_FAIL_PAM + PAM_AUTH_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar auth = &request->auth_data.ndmp_auth_data_u.auth_text;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (strcmp(uname, auth->user) != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Authorization denied. Not a valid user.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NOT_AUTHORIZED_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_audit_connect(connection,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ADT_FAIL_PAM + PAM_AUTH_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar passwd = ndmpd_get_prop(NDMP_CLEARTEXT_PASSWORD);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!passwd || !*passwd) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Authorization denied.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Cleartext password is not set at server.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NOT_AUTHORIZED_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_set_authorized(connection, FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, (void *) &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending ndmp_connect_client_auth reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_audit_connect(connection,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ADT_FAIL_PAM + PAM_AUTH_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dec_passwd = ndmp_base64_decode(passwd);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!dec_passwd || !*dec_passwd ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar strcmp(auth->password, dec_passwd) != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Authorization denied. Invalid password.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NOT_AUTHORIZED_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Authorization granted.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_audit_connect(connection, reply.error ?
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ADT_FAIL_PAM + PAM_AUTH_ERR : 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(dec_passwd);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_AUTH_MD5:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* Check authorization. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((uname = ndmpd_get_prop(NDMP_CRAM_MD5_USERNAME)) == NULL ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *uname == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Authorization denied.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "User name is not set at server.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NOT_AUTHORIZED_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_set_authorized(connection, FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, (void *) &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending ndmp_connect_client_auth reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_audit_connect(connection,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ADT_FAIL_PAM + PAM_AUTH_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar md5 = &request->auth_data.ndmp_auth_data_u.auth_md5;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar passwd = ndmpd_get_prop(NDMP_CRAM_MD5_PASSWORD);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!passwd || !*passwd) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Authorization denied.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "MD5 password is not set at server.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NOT_AUTHORIZED_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_set_authorized(connection, FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, (void *) &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending ndmp_connect_client_auth reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_audit_connect(connection,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ADT_FAIL_PAM + PAM_AUTH_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dec_passwd = ndmp_base64_decode(passwd);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar create_md5_digest(md5_digest, dec_passwd,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_challenge);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (strcmp(uname, md5->user) != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Authorization denied. Not a valid user.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NOT_AUTHORIZED_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (memcmp(md5_digest, md5->auth_digest,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sizeof (md5_digest)) != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Authorization denied. Invalid password.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NOT_AUTHORIZED_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Authorization granted");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_audit_connect(connection, reply.error ?
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ADT_FAIL_PAM + PAM_AUTH_ERR : 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(dec_passwd);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_ARGS_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (reply.error == NDMP_NO_ERR)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_set_authorized(connection, TRUE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_set_authorized(connection, FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, (void *) &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending ndmp_connect_client_auth reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_connect_server_auth_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This handler authenticates the server to the client.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * msginfo (input) - request message.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_connect_server_auth_v2(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_server_auth_request *request;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_server_auth_reply reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request = (ndmp_connect_server_auth_request *)body;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "auth_type:%s",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request->client_attr.auth_type == NDMP_AUTH_NONE ? "None" :
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (request->client_attr.auth_type == NDMP_AUTH_TEXT ? "Text" :
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (request->client_attr.auth_type == NDMP_AUTH_MD5 ? "MD5" :
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Invalid")));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.auth_result.auth_type = request->client_attr.auth_type;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (request->client_attr.auth_type) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_AUTH_NONE:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_AUTH_TEXT:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.auth_result.ndmp_auth_data_u.auth_text.user = "ndmpd";
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.auth_result.ndmp_auth_data_u.auth_text.password =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "ndmpsdk";
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_AUTH_MD5:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_ARGS_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_ARGS_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, (void *) &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending ndmp_connect_auth reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_connect_close_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This handler closes the connection.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * msginfo (input) - request message.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_connect_close_v2(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((session = (ndmpd_session_t *)ndmp_get_client_data(connection))) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmp_close(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_eof = TRUE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMP V3 HANDLERS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_connect_client_auth_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This handler authorizes the NDMP connection.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * msginfo (input) - request message.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_connect_client_auth_v3(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_client_auth_request_v3 *request;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_client_auth_reply_v3 reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_auth_text_v3 *auth;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_auth_md5_v3 *md5;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct in_addr addr;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *uname;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *type;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request = (ndmp_connect_client_auth_request_v3 *)body;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "auth_type %s",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request->auth_data.auth_type == NDMP_AUTH_NONE ? "None" :
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request->auth_data.auth_type == NDMP_AUTH_TEXT ? "Text" :
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request->auth_data.auth_type == NDMP_AUTH_MD5 ? "MD5" : "Invalid");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (request->auth_data.auth_type) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_AUTH_NONE:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar type = "none";
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NOT_SUPPORTED_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_audit_connect(connection, ENOTSUP);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_AUTH_TEXT:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* Check authorization. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((uname = ndmpd_get_prop(NDMP_CLEARTEXT_USERNAME)) == NULL ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *uname == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Authorization denied.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "User name is not set at server.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NOT_AUTHORIZED_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_set_authorized(connection, FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, (void *) &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending ndmp_connect_client_auth reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_audit_connect(connection,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ADT_FAIL_PAM + PAM_AUTH_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar type = "text";
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar auth = &request->auth_data.ndmp_auth_data_v3_u.auth_text;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = ndmpd_connect_auth_text(uname, auth->auth_id,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar auth->auth_password);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_audit_connect(connection, reply.error ?
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ADT_FAIL_PAM + PAM_AUTH_ERR : 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_AUTH_MD5:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* Check authorization. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((uname = ndmpd_get_prop(NDMP_CRAM_MD5_USERNAME)) == NULL ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *uname == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Authorization denied.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "User name is not set at server.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NOT_AUTHORIZED_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_set_authorized(connection, FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, (void *) &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending ndmp_connect_client_auth reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_audit_connect(connection,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ADT_FAIL_PAM + PAM_AUTH_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar type = "md5";
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar md5 = &request->auth_data.ndmp_auth_data_v3_u.auth_md5;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = ndmpd_connect_auth_md5(uname, md5->auth_id,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar md5->auth_digest, session->ns_challenge);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_audit_connect(connection, reply.error ?
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ADT_FAIL_PAM + PAM_AUTH_ERR : 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar type = "unknown";
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_ARGS_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_audit_connect(connection, EINVAL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (reply.error == NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_set_authorized(connection, TRUE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_set_authorized(connection, FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (tcp_get_peer(connection->conn_sock, &addr.s_addr,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NULL) != -1) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Authorization(%s) denied for %s.", type,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar inet_ntoa(IN_ADDR(addr)));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, (void *) &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending ndmp_connect_auth reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_connect_close_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Close the connection to the DMA.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Send the SHUTDOWN message before closing the socket connection to the DMA.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * msginfo (input) - request message.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_connect_close_v3(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session;
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_notify_connected_request req;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!(session = (ndmpd_session_t *)ndmp_get_client_data(connection)))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl if ((nlp = ndmp_get_nlp(session)) == NULL)
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "ver: %u",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_protocol_version);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* Send the SHUTDOWN message before closing the connection. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar req.reason = NDMP_SHUTDOWN;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar req.protocol_version = session->ns_protocol_version;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar req.text_reason = "Connection closed by server.";
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_send_request(connection, NDMP_NOTIFY_CONNECTION_STATUS,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_NO_ERR, (void *) &req, 0) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_NOTICE, "Sending connection shutdown notify");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl (void) mutex_lock(&nlp->nlp_mtx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_close(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_eof = TRUE;
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl (void) cond_broadcast(&nlp->nlp_cv);
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl (void) mutex_unlock(&nlp->nlp_mtx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMP V4 HANDLERS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * LOCALS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * create_md5_digest
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This function uses the MD5 message-digest algorithm described
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * in RFC1321 to authenticate the client using a shared secret (password).
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * The message used to compute the MD5 digest is a concatenation of password,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * null padding, the 64 byte fixed length challenge and a repeat of the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * password. The length of the null padding is chosen to result in a 128 byte
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * fixed length message. The lengh of the padding can be computed as
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 64 - 2*(length of the password). The client digest is computed using the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * server challenge from the NDMP_CONFIG_GET_AUTH_ATTR reply.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * digest (output) - 16 bytes MD5 digest
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * passwd (input) - user password
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * challenge (input) - 64 bytes server challenge
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarcreate_md5_digest(unsigned char *digest, char *passwd, unsigned char *challenge)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char buf[130];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *p = &buf[0];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int len, i;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar MD5_CTX md;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *pwd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *p = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar pwd = passwd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((len = strlen(pwd)) > MD5_PASS_LIMIT)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar len = MD5_PASS_LIMIT;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memcpy(p, pwd, len);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar p += len;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (i = 0; i < MD5_CHALLENGE_SIZE - 2 * len; i++)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *p++ = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memcpy(p, challenge, MD5_CHALLENGE_SIZE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar p += MD5_CHALLENGE_SIZE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) strlcpy(p, pwd, MD5_PASS_LIMIT);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar MD5Init(&md);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar MD5Update(&md, buf, 128);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar MD5Final(digest, &md);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_connect_list_find
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Find the element in the active connection list.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handler.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NULL - error
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection list element pointer
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic struct conn_list *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_connect_list_find(ndmp_connection_t *connection)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct conn_list *clp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "connection: 0x%p",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar LIST_FOREACH(clp, &cl_head, cl_q) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (clp->cl_conn == connection) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&cl_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (clp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpconnect_list_add
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Add the new connection to the list of the active connections.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handler.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * id (input/output) - pointer to connection id.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0 - success
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * -1 - error
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_connect_list_add(ndmp_connection_t *connection, int *id)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct conn_list *clp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (connection == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Invalid argument");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((clp = ndmp_malloc(sizeof (struct conn_list))) == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar clp->cl_conn = connection;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar clp->cl_id = *id;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_lock(&cl_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar LIST_INSERT_HEAD(&cl_head, clp, cl_q);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (*id)++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&cl_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_connect_list_del
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Delete the specified connection from the list.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handler.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0 - success
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * -1 - error
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_connect_list_del(ndmp_connection_t *connection)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct conn_list *clp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_lock(&cl_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!(clp = ndmp_connect_list_find(connection))) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&cl_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "connection not found");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar LIST_REMOVE(clp, cl_q);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&cl_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(clp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpconnect_list_find_id
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Find the element specified by its id in the list of active connections.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * id (input) - connection id.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NULL - error
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection list element pointer
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic struct conn_list *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_connect_list_find_id(int id)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct conn_list *clp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "id: %d", id);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_lock(&cl_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar LIST_FOREACH(clp, &cl_head, cl_q) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (clp->cl_id == id) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&cl_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (clp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&cl_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Get common fields of the active connection.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_connect_get_conn(struct conn_list *clp, ndmp_door_ctx_t *enc_ctx)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int port;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct in_addr addr;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char cl_addr[NDMP_CL_ADDR_LEN];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!(session = (ndmpd_session_t *)ndmp_get_client_data(clp->cl_conn)))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, clp->cl_id);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_protocol_version);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, clp->cl_conn->conn_authorized);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_eof);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (tcp_get_peer(clp->cl_conn->conn_sock, &(addr.s_addr), &port) != -1)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) snprintf(cl_addr, NDMP_CL_ADDR_LEN, "%s:%d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (char *)inet_ntoa(addr), port);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cl_addr[0] = '\0';
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_string(enc_ctx, cl_addr);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Get the connection SCSI info.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_connect_get_scsi_v2(ndmpd_session_t *session, ndmp_door_ctx_t *enc_ctx)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_scsi.sd_is_open);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_string(enc_ctx, session->ns_scsi.sd_adapter_name);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_scsi.sd_valid_target_set);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_scsi.sd_valid_target_set) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_scsi.sd_sid);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_scsi.sd_lun);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Get the connection tape info.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_connect_get_tape_v2(ndmpd_session_t *session, ndmp_door_ctx_t *enc_ctx)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char dev_name[NDMP_TAPE_DEV_NAME];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_tape.td_fd);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_tape.td_fd != -1) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint64(enc_ctx, session->ns_tape.td_record_count);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_tape.td_mode);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) snprintf(dev_name, NDMP_TAPE_DEV_NAME, "%st%02x%x",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_tape.td_adapter_name, session->ns_tape.td_sid,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_tape.td_lun);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_string(enc_ctx, dev_name);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_string(enc_ctx, session->ns_tape.td_adapter_name);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_tape.td_sid);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_tape.td_lun);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Get the connection mover info.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_connect_get_mover_v2(ndmpd_session_t *session, ndmp_door_ctx_t *enc_ctx)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_mover.md_state);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_mover.md_mode);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_mover.md_pause_reason);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_mover.md_halt_reason);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint64(enc_ctx, session->ns_mover.md_record_size);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint64(enc_ctx, session->ns_mover.md_record_num);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint64(enc_ctx, session->ns_mover.md_position);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint64(enc_ctx, session->ns_mover.md_window_offset);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint64(enc_ctx, session->ns_mover.md_window_length);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_mover.md_sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Get the connection common data info.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_connect_get_data_common(ndmpd_session_t *session, ndmp_door_ctx_t *enc_ctx)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int i;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_pval *ep;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int len;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_data.dd_operation);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_data.dd_state);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_data.dd_halt_reason);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_data.dd_sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_data.dd_mover.addr_type);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_data.dd_abort);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint64(enc_ctx, session->ns_data.dd_read_offset);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint64(enc_ctx, session->ns_data.dd_read_length);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint64(enc_ctx, session->ns_data.dd_data_size);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* verify data.env has as much data as in session->ns_data.dd_env_len */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar len = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ep = session->ns_data.dd_env;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (i = 0; ep && i < session->ns_data.dd_env_len; i++, ep++)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar len++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* put the len */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_lock(&session->ns_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint64(enc_ctx, len);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ep = session->ns_data.dd_env;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (i = 0; i < len; i++, ep++) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_string(enc_ctx, ep->name);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_string(enc_ctx, ep->value);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&session->ns_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Get the connection data info.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_connect_get_data_v2(ndmpd_session_t *session, ndmp_door_ctx_t *enc_ctx)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int i;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_name *np;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char tcp_addr[NDMP_TCP_ADDR_SIZE];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_get_data_common(session, enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (session->ns_data.dd_mover.addr_type) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_LOCAL:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) snprintf(tcp_addr, NDMP_TCP_ADDR_SIZE, "%s", "Local");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_string(enc_ctx, tcp_addr);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_TCP:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) snprintf(tcp_addr, NDMP_TCP_ADDR_SIZE, "%s:%d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (char *)inet_ntoa(IN_ADDR(
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_mover.ndmp_mover_addr_u.addr.ip_addr)),
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_mover.ndmp_mover_addr_u.addr.port);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_string(enc_ctx, tcp_addr);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) snprintf(tcp_addr, NDMP_TCP_ADDR_SIZE, "%s", "Unknown");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_string(enc_ctx, tcp_addr);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint64(enc_ctx, session->ns_data.dd_nlist_len);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar np = session->ns_data.dd_nlist;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (i = 0; np && i < (int)session->ns_data.dd_nlist_len; i++, np++) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_string(enc_ctx, np->name);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_string(enc_ctx, np->dest);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Get V2 connection info.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_connect_get_v2(ndmp_connection_t *connection, ndmp_door_ctx_t *enc_ctx)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((session = (ndmpd_session_t *)ndmp_get_client_data(connection))) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_get_scsi_v2(session, enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_get_tape_v2(session, enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_get_mover_v2(session, enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_get_data_v2(session, enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Get the V3 connection mover info.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_connect_get_mover_v3(ndmpd_session_t *session, ndmp_door_ctx_t *enc_ctx)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char tcp_addr[NDMP_TCP_ADDR_SIZE];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* get all the V2 mover data first */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_get_mover_v2(session, enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* get the V3 mover data now */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_mover.md_listen_sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_mover.md_data_addr.addr_type);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tcp_addr[0] = '\0';
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) snprintf(tcp_addr, NDMP_TCP_ADDR_SIZE, "%s:%d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (char *)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar inet_ntoa(IN_ADDR(session->ns_mover.md_data_addr.tcp_ip_v3)),
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (int)session->ns_mover.md_data_addr.tcp_port_v3);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_string(enc_ctx, tcp_addr);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Get the connection data info.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_connect_get_data_v3(ndmpd_session_t *session, ndmp_door_ctx_t *enc_ctx)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t i;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mem_ndmp_name_v3_t *np;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char tcp_addr[NDMP_TCP_ADDR_SIZE];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_get_data_common(session, enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) snprintf(tcp_addr, NDMP_TCP_ADDR_SIZE, "%s:%d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (char *)inet_ntoa(IN_ADDR(session->ns_data.dd_data_addr.tcp_ip_v3)),
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (int)session->ns_data.dd_data_addr.tcp_port_v3);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_string(enc_ctx, tcp_addr);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, session->ns_data.dd_listen_sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint64(enc_ctx,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_stats.ms_bytes_processed);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint64(enc_ctx, session->ns_data.dd_nlist_len);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar np = session->ns_data.dd_nlist_v3;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (i = 0; np && i < (int)session->ns_data.dd_nlist_len; i++, np++) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_string(enc_ctx, np->nm3_opath);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_string(enc_ctx, np->nm3_dpath);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint64(enc_ctx, np->nm3_node);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint64(enc_ctx, np->nm3_fh_info);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Get V3 connection info.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_connect_get_v3(ndmp_connection_t *connection, ndmp_door_ctx_t *enc_ctx)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((session = (ndmpd_session_t *)ndmp_get_client_data(connection))) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_get_scsi_v2(session, enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_get_tape_v2(session, enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_get_mover_v3(session, enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_get_data_v3(session, enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Get the list of all active sessions to the clients. For each version,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * call the appropriate get function.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarconnection_get(struct conn_list *clp, ndmp_door_ctx_t *enc_ctx)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session = (ndmpd_session_t *)ndmp_get_client_data(clp->cl_conn);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!session) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, NDMP_SESSION_NODATA);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, NDMP_SESSION_DATA);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (session->ns_protocol_version) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMPV2:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_get_conn(clp, enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_get_v2(clp->cl_conn, enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMPV3:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMPV4:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_get_conn(clp, enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_get_v3(clp->cl_conn, enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Invalid session (0x%p) version 0x%x", session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_protocol_version);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_connect_kill
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Kill the connection based on its version.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handler.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0 - success
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * -1 - error
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_connect_kill(ndmp_connection_t *connection)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!(session = (ndmpd_session_t *)ndmp_get_client_data(connection)))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (session->ns_protocol_version) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMPV2:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_connect_close_v2(connection, (void *)NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMPV3:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMPV4:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_connect_close_v3(connection, (void *)NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Invalid session (0x%p) version 0x%x", session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_protocol_version);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Get the list of all active sessions to the clients.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_connect_list_get(ndmp_door_ctx_t *enc_ctx)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int n;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct conn_list *clp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar n = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_lock(&cl_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar LIST_FOREACH(clp, &cl_head, cl_q) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar n++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* write number of connections */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, n);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar n = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar LIST_FOREACH(clp, &cl_head, cl_q) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar connection_get(clp, enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar n++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&cl_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_connect_kill_id
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Find a connection by its id and kill it.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * id (input) - connection id.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0 - success
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * -1 - error
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_connect_kill_id(int id)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct conn_list *clp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!(clp = ndmp_connect_list_find_id(id)))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (ndmpd_connect_kill(clp->cl_conn));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Get the devices info */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_get_devs(ndmp_door_ctx_t *enc_ctx)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int i, n;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sasd_drive_t *sd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar scsi_link_t *slink;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((n = sasd_dev_count()) == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, n);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "No device attached.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, n);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (i = 0; i < n; i++) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sd = sasd_drive(i);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar slink = sasd_dev_slink(i);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, slink->sl_type);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_string(enc_ctx, sd->sd_name);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, slink->sl_lun);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, slink->sl_sid);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_string(enc_ctx, sd->sd_vendor);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_string(enc_ctx, sd->sd_id);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_string(enc_ctx, sd->sd_rev);
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar ndmp_door_put_string(enc_ctx, sd->sd_serial);
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar ndmp_door_put_string(enc_ctx, sd->sd_wwn);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_connect_auth_text
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Checks text authorization.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * auth_id (input) - user name
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * auth_password(input) - password
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMP_NO_ERR: on success
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Other NDMP_ error: invalid user name and password
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_connect_auth_text(char *uname, char *auth_id, char *auth_password)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *passwd, *dec_passwd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int rv;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (strcmp(uname, auth_id) != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = NDMP_NOT_AUTHORIZED_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar passwd = ndmpd_get_prop(NDMP_CLEARTEXT_PASSWORD);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!passwd || !*passwd) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = NDMP_NOT_AUTHORIZED_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dec_passwd = ndmp_base64_decode(passwd);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (dec_passwd == NULL || *dec_passwd == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = NDMP_NOT_AUTHORIZED_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else if (strcmp(auth_password, dec_passwd) != 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = NDMP_NOT_AUTHORIZED_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(dec_passwd);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (rv == NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Authorization granted.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Authorization denied.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (rv);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_connect_auth_md5
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Checks MD5 authorization.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * auth_id (input) - user name
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * auth_digest(input) - MD5 digest
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This is a 16 bytes digest info which is a MD5 transform of 128 bytes
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * message (password + padding + server challenge + password). Server
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * challenge is a 64 bytes random string per NDMP session sent out to the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * client on demand (See NDMP_CONFIG_GET_AUTH_ATTR command).
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMP_NO_ERR: on success
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Other NDMP_ error: invalid user name and password
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_connect_auth_md5(char *uname, char *auth_id, char *auth_digest,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned char *auth_challenge)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *passwd, *dec_passwd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned char digest[16];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int rv;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (strcmp(uname, auth_id) != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = NDMP_NOT_AUTHORIZED_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar passwd = ndmpd_get_prop(NDMP_CRAM_MD5_PASSWORD);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (passwd == NULL || *passwd == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = NDMP_NOT_AUTHORIZED_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dec_passwd = ndmp_base64_decode(passwd);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (dec_passwd == NULL || *dec_passwd == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = NDMP_NOT_AUTHORIZED_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar create_md5_digest(digest, dec_passwd,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar auth_challenge);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (memcmp(digest, auth_digest,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sizeof (digest)) != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = NDMP_NOT_AUTHORIZED_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(dec_passwd);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (rv == NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Authorization granted.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Authorization denied.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (rv);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}