ui-sun.c revision 4bff34e37def8a90f9194d81bc345c52ba20086a
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#pragma ident "%Z%%M% %I% %E% SMI"
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>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <netsmb/smb_keychain.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define MAXLINE 127
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define MAXPASSWD 256 /* from libc:getpass */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
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}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowint
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmb_get_authentication(
4bff34e37def8a90f9194d81bc345c52ba20086athurlow char *dom, size_t domlen,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow char *usr, size_t usrlen,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow char *passwd, size_t passwdlen,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow const char *systemname, struct smb_ctx *ctx)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow char *npw;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int error, i, kcask, kcerr;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (ctx->ct_flags & SMBCF_KCFOUND || ctx->ct_flags & SMBCF_KCBAD) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow ctx->ct_flags &= ~SMBCF_KCFOUND;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow } else {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow ctx->ct_flags &= ~(SMBCF_KCFOUND | SMBCF_KCDOMAIN);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 1st: try lookup using system name
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow kcerr = smbfs_keychain_chk(systemname, usr);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (!kcerr) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Need passwd to be not empty for existing logic.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * The string here is arbitrary (a debugging hint)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * and will be replaced in the driver by the real
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * password from the keychain.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow strcpy(passwd, "$KC_SYSTEM");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow ctx->ct_flags |= SMBCF_KCFOUND;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (smb_debug) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow printf("found keychain entry for"
4bff34e37def8a90f9194d81bc345c52ba20086athurlow " server/user: %s/%s\n",
4bff34e37def8a90f9194d81bc345c52ba20086athurlow systemname, usr);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (0);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 2nd: try lookup using domain name
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow kcerr = smbfs_keychain_chk(dom, usr);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (!kcerr) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* Need passwd to be not empty... (see above) */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow strcpy(passwd, "$KC_DOMAIN");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow ctx->ct_flags |= (SMBCF_KCFOUND | SMBCF_KCDOMAIN);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (smb_debug) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow printf("found keychain entry for"
4bff34e37def8a90f9194d81bc345c52ba20086athurlow " domain/user: %s/%s\n",
4bff34e37def8a90f9194d81bc345c52ba20086athurlow dom, usr);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (0);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (isatty(STDIN_FILENO)) { /* need command-line prompting? */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (passwd && passwd[0] == '\0') {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow npw = getpassphrase(dgettext(TEXT_DOMAIN, "Password:"));
4bff34e37def8a90f9194d81bc345c52ba20086athurlow strncpy(passwd, npw, passwdlen);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (0);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * XXX: Ask the user for help, possibly via
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * GNOME dbus or some such... (todo).
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smb_error(dgettext(TEXT_DOMAIN,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "Cannot prompt for a password when input is redirected."), 0);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (ENOTTY);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
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}