/* * 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@ */ #pragma ident "%Z%%M% %I% %E% SMI" /* * Routines for interacting with the user to get credentials * (workgroup/domain, username, password, etc.) */ #include #include #include #include #include #include #include #include #include #define MAXLINE 127 #define MAXPASSWD 256 /* from libc:getpass */ 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); } int smb_get_authentication( char *dom, size_t domlen, char *usr, size_t usrlen, char *passwd, size_t passwdlen, const char *systemname, struct smb_ctx *ctx) { char *npw; int error, i, kcask, kcerr; if (ctx->ct_flags & SMBCF_KCFOUND || ctx->ct_flags & SMBCF_KCBAD) { ctx->ct_flags &= ~SMBCF_KCFOUND; } else { ctx->ct_flags &= ~(SMBCF_KCFOUND | SMBCF_KCDOMAIN); /* * 1st: try lookup using system name */ kcerr = smbfs_keychain_chk(systemname, usr); if (!kcerr) { /* * Need passwd to be not empty for existing logic. * The string here is arbitrary (a debugging hint) * and will be replaced in the driver by the real * password from the keychain. */ strcpy(passwd, "$KC_SYSTEM"); ctx->ct_flags |= SMBCF_KCFOUND; if (smb_debug) { printf("found keychain entry for" " server/user: %s/%s\n", systemname, usr); } return (0); } /* * 2nd: try lookup using domain name */ kcerr = smbfs_keychain_chk(dom, usr); if (!kcerr) { /* Need passwd to be not empty... (see above) */ strcpy(passwd, "$KC_DOMAIN"); ctx->ct_flags |= (SMBCF_KCFOUND | SMBCF_KCDOMAIN); if (smb_debug) { printf("found keychain entry for" " domain/user: %s/%s\n", dom, usr); } return (0); } } if (isatty(STDIN_FILENO)) { /* need command-line prompting? */ if (passwd && passwd[0] == '\0') { npw = getpassphrase(dgettext(TEXT_DOMAIN, "Password:")); strncpy(passwd, npw, passwdlen); } return (0); } /* * 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); } int smb_browse(struct smb_ctx *ctx, int anon) { /* * Let user pick a share. * Not supported. */ return (EINTR); }