4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Copyright (c) 2001 Apple Computer, Inc. All rights reserved.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * @APPLE_LICENSE_HEADER_START@
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * "Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Reserved. This file contains Original Code and/or Modifications of
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Original Code as defined in and that are subject to the Apple Public
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Source License Version 1.0 (the 'License'). You may not use this file
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * except in compliance with the License. Please obtain a copy of the
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * License at http://www.apple.com/publicsource and read it before using
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * this file.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * The Original Code and all software distributed under the License are
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * License for the specific language governing rights and limitations
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * under the License."
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * @APPLE_LICENSE_HEADER_END@
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Routines for interacting with the user to get credentials
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * (workgroup/domain, username, password, etc.)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <stdlib.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <stdio.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <string.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <errno.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <unistd.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <libintl.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <ctype.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <netsmb/smb_lib.h>
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross#include "private.h"
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross#include "ntlm.h"
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross#if 0 /* not yet */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define MAXLINE 127
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic void
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmb_tty_prompt(char *prmpt,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow char *buf, size_t buflen)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow char temp[MAXLINE+1];
4bff34e37def8a90f9194d81bc345c52ba20086athurlow char *cp;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int ch;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow memset(temp, 0, sizeof (temp));
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow fprintf(stderr, "%s", prmpt);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow cp = temp;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow while ((ch = getc(stdin)) != EOF) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (ch == '\n' || ch == '\r')
4bff34e37def8a90f9194d81bc345c52ba20086athurlow break;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (isspace(ch) || iscntrl(ch))
4bff34e37def8a90f9194d81bc345c52ba20086athurlow continue;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *cp++ = ch;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (cp == &temp[MAXLINE])
4bff34e37def8a90f9194d81bc345c52ba20086athurlow break;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* If input empty, accept default. */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (cp == temp)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* Use input as new value. */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow strncpy(buf, temp, buflen);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross#endif /* not yet */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross/*
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Prompt for a new password after auth. failure.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * (and maybe new user+domain, but not yet)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowint
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rosssmb_get_authentication(struct smb_ctx *ctx)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow char *npw;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross int err;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /*
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * If we're getting a password, we must be doing
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * some kind of NTLM, possibly after a failure to
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * authenticate using Kerberos. Turn off krb5.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross ctx->ct_authflags &= ~SMB_AT_KRB5;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (ctx->ct_flags & SMBCF_KCFOUND) {
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /* Tried a keychain hash and failed. */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /* XXX: delete the KC entry? */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross ctx->ct_flags |= SMBCF_KCBAD;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross }
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (ctx->ct_flags & SMBCF_NOPWD)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross return (ENOTTY);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (isatty(STDIN_FILENO)) {
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /* Need command-line prompting. */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross npw = getpassphrase(dgettext(TEXT_DOMAIN, "Password:"));
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (npw == NULL)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross return (EINTR);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross memset(ctx->ct_password, 0, sizeof (ctx->ct_password));
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross strlcpy(ctx->ct_password, npw, sizeof (ctx->ct_password));
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross } else {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /*
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * XXX: Ask the user for help, possibly via
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * GNOME dbus or some such... (todo).
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross smb_error(dgettext(TEXT_DOMAIN,
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross "Cannot prompt for a password when input is redirected."), 0);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross return (ENOTTY);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /*
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Recompute the password hashes.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (ctx->ct_password[0]) {
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross err = ntlm_compute_lm_hash(ctx->ct_lmhash, ctx->ct_password);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (err != 0)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross return (err);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross err = ntlm_compute_nt_hash(ctx->ct_nthash, ctx->ct_password);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (err != 0)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross return (err);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross return (0);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross/*ARGSUSED*/
4bff34e37def8a90f9194d81bc345c52ba20086athurlowint
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmb_browse(struct smb_ctx *ctx, int anon)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Let user pick a share.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Not supported.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (EINTR);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}