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