ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross/*
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * CDDL HEADER START
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross *
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * The contents of this file are subject to the terms of the
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * Common Development and Distribution License (the "License").
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * You may not use this file except in compliance with the License.
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross *
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * or http://www.opensolaris.org/os/licensing.
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * See the License for the specific language governing permissions
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * and limitations under the License.
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross *
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * When distributing Covered Code, include this CDDL HEADER in each
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * If applicable, add the following below this CDDL HEADER, with the
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * fields enclosed by brackets "[]" replaced with your own identifying
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * information: Portions Copyright [yyyy] [name of copyright owner]
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross *
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * CDDL HEADER END
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross */
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross/*
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross */
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross/*
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * There used to be a "redirector" library, which has been replaced,
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * leaving only the "glue" functions in this file that adapt this
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * library to the interface provided by libsmbfs.
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross */
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross#include <errno.h>
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross#include <string.h>
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross#include <strings.h>
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross#include <unistd.h>
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross#include <priv.h>
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross#include <netsmb/smbfs_api.h>
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross#include <smbsrv/libsmb.h>
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross#include <smbsrv/libmlsvc.h>
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross#include <libsmbrdr.h>
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross#include <mlsvc.h>
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross#include <assert.h>
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Rossvoid
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Rosssmbrdr_initialize(void)
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross{
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross (void) smb_lib_init();
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross}
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross/*
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * mlsvc_disconnect
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross *
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * Disconnects the session with given server.
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * The new conection manager is smart enough
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * so that we don't need this to do anything.
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross */
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross/* ARGSUSED */
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Rossvoid
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Rosssmbrdr_disconnect(const char *server)
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross{
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross}
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross/*
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * smbrdr_logon
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross *
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * I'm not sure this really needs to do anything, but for now
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * let's go ahead and authenticate here so this can return a
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * status reflecting the outcome of authentication.
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross *
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * If this successfully builds an smb_ctx, it just frees it.
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * The driver retains sessions for a little while after the
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * last reference goes away, so the session created here will
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * usually still exist when the next call to smbrdr_ctx_new
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * asks for this server+user (immediately after this returns),
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * and only one session setup will go over the wire.
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross */
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Rossint
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Rosssmbrdr_logon(char *srv, char *dom, char *user)
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross{
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross struct smb_ctx *ctx;
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross int err;
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross err = smbrdr_ctx_new(&ctx, srv, dom, user);
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross if (err == 0)
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross smb_ctx_free(ctx);
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross return (err);
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross}
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Rossvoid
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Rosssmbrdr_ctx_free(struct smb_ctx *ctx)
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross{
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross smb_ctx_free(ctx);
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross}
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross/*
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * Setup a new SMB client context.
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross *
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * Get the SMB server's configuration stuff and
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * store it in the new client context object.
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross */
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Rossint
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Rosssmbrdr_ctx_new(struct smb_ctx **ctx_p, char *server,
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross char *domain, char *user)
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross{
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross struct smb_ctx *ctx = NULL;
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross uchar_t nthash[SMBAUTH_HASH_SZ];
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross int64_t lmcl;
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross int authflags, err;
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross assert(server != NULL);
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross assert(domain != NULL);
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross assert(user != NULL);
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross if (server[0] == '\0')
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross return (NT_STATUS_INTERNAL_ERROR);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross if ((err = smb_ctx_alloc(&ctx)) != 0)
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross return (NT_STATUS_NO_MEMORY);
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross /*
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * Set server, share, domain, user
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * (in the ctx handle).
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross */
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross (void) smb_ctx_setfullserver(ctx, server);
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross (void) smb_ctx_setshare(ctx, "IPC$", USE_IPC);
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross (void) smb_ctx_setdomain(ctx, domain, B_TRUE);
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross (void) smb_ctx_setuser(ctx, user, B_TRUE);
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross /*
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * Set auth. info (hash) and type.
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross */
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross if (user[0] == '\0') {
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross authflags = SMB_AT_ANON;
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross } else {
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross (void) smb_config_getnum(SMB_CI_LM_LEVEL, &lmcl);
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross if (lmcl <= 2) {
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross /* Send NTLM */
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross authflags = SMB_AT_NTLM1;
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross } else {
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross /* Send NTLMv2 */
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross authflags = SMB_AT_NTLM2;
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross }
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross smb_ipc_get_passwd(nthash, sizeof (nthash));
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross (void) smb_ctx_setpwhash(ctx, nthash, NULL);
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross }
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross (void) smb_ctx_setauthflags(ctx, authflags);
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross /*
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * Do lookup, connect, session setup, tree connect.
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross * Or find and reuse a session/tree, if one exists.
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross */
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross if ((err = smb_ctx_resolve(ctx)) != 0) {
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross err = NT_STATUS_BAD_NETWORK_PATH;
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross goto errout;
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross }
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross if ((err = smb_ctx_get_ssn(ctx)) != 0) {
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross err = NT_STATUS_NETWORK_ACCESS_DENIED;
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross goto errout;
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross }
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross if ((err = smb_ctx_get_tree(ctx)) != 0) {
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross err = NT_STATUS_BAD_NETWORK_NAME;
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross goto errout;
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross }
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross /* Success! */
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross *ctx_p = ctx;
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross return (0);
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Rosserrout:
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross smb_ctx_free(ctx);
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross return (err);
ed9aabc708901eb85fb058aacbd851c0fd958a16Gordon Ross}