Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/netbsd-1-5]: src/crypto/dist/ssh Pull up revisions 1.2-1.3 (requested by...
details: https://anonhg.NetBSD.org/src/rev/6107af742467
branches: netbsd-1-5
changeset: 490698:6107af742467
user: he <he%NetBSD.org@localhost>
date: Mon Feb 26 20:26:40 2001 +0000
description:
Pull up revisions 1.2-1.3 (requested by itojun):
Update SSH to version found on trunk as of 26 Feb 2001.
diffstat:
crypto/dist/ssh/auth.c | 280 ++++++++++++++++++++
crypto/dist/ssh/authfile.c | 593 +++++++++++++++++++++++++++++++++++++++++++
crypto/dist/ssh/compress.c | 142 ++++++++++
crypto/dist/ssh/hostfile.h | 40 ++
crypto/dist/ssh/includes.h | 71 +++++
crypto/dist/ssh/log-server.c | 175 ++++++++++++
crypto/dist/ssh/mpaux.c | 46 +++
crypto/dist/ssh/pty.c | 297 +++++++++++++++++++++
crypto/dist/ssh/readpass.c | 55 +++
crypto/dist/ssh/ssh-add.1 | 134 +++++++++
crypto/dist/ssh/ssh-agent.1 | 176 ++++++++++++
crypto/dist/ssh/ssh-keygen.1 | 238 +++++++++++++++++
crypto/dist/ssh/tildexpand.c | 72 +++++
crypto/dist/ssh/uuencode.c | 77 +++++
crypto/dist/ssh/xmalloc.c | 68 ++++
15 files changed, 2464 insertions(+), 0 deletions(-)
diffs (truncated from 2524 to 300 lines):
diff -r a947236abede -r 6107af742467 crypto/dist/ssh/auth.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/crypto/dist/ssh/auth.c Mon Feb 26 20:26:40 2001 +0000
@@ -0,0 +1,280 @@
+/*
+ * Copyright (c) 2000 Markus Friedl. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "includes.h"
+RCSID("$OpenBSD: auth.c,v 1.17 2001/02/12 16:16:23 markus Exp $");
+
+#include "xmalloc.h"
+#include "match.h"
+#include "groupaccess.h"
+#include "log.h"
+#include "servconf.h"
+#include "auth.h"
+#include "auth-options.h"
+#include "canohost.h"
+
+#ifdef HAVE_LOGIN_CAP
+#include <login_cap.h>
+#endif
+
+/* import */
+extern ServerOptions options;
+
+/*
+ * Check if the user is allowed to log in via ssh. If user is listed
+ * in DenyUsers or one of user's groups is listed in DenyGroups, false
+ * will be returned. If AllowUsers isn't empty and user isn't listed
+ * there, or if AllowGroups isn't empty and one of user's groups isn't
+ * listed there, false will be returned.
+ * If the user's shell is not executable, false will be returned.
+ * Otherwise true is returned.
+ */
+int
+allowed_user(struct passwd * pw)
+{
+ struct stat st;
+ char *shell;
+ int i;
+#ifdef HAVE_LOGIN_CAP
+ int match_name, match_ip;
+ login_cap_t *lc;
+ const char *hostname, *ipaddr;
+ char *cap_hlist, *hp;
+#endif
+
+ /* Shouldn't be called if pw is NULL, but better safe than sorry... */
+ if (!pw || !pw->pw_name)
+ return 0;
+
+#ifdef HAVE_LOGIN_CAP
+ hostname = get_canonical_hostname(1);
+ ipaddr = get_remote_ipaddr();
+
+ lc = login_getclass(pw->pw_class);
+
+ /*
+ * Check the deny list.
+ */
+ cap_hlist = login_getcapstr(lc, "host.deny", NULL, NULL);
+ if (cap_hlist != NULL) {
+ hp = strtok(cap_hlist, ",");
+ while (hp != NULL) {
+ match_name = match_hostname(hostname,
+ hp, strlen(hp));
+ match_ip = match_hostname(ipaddr,
+ hp, strlen(hp));
+ /*
+ * Only a positive match here causes a "deny".
+ */
+ if (match_name > 0 || match_ip > 0) {
+ free(cap_hlist);
+ login_close(lc);
+ return 0;
+ }
+ hp = strtok(NULL, ",");
+ }
+ free(cap_hlist);
+ }
+
+ /*
+ * Check the allow list. If the allow list exists, and the
+ * remote host is not in it, the user is implicitly denied.
+ */
+ cap_hlist = login_getcapstr(lc, "host.allow", NULL, NULL);
+ if (cap_hlist != NULL) {
+ hp = strtok(cap_hlist, ",");
+ if (hp == NULL) {
+ /* Just in case there's an empty string... */
+ free(cap_hlist);
+ login_close(lc);
+ return 0;
+ }
+ while (hp != NULL) {
+ match_name = match_hostname(hostname,
+ hp, strlen(hp));
+ match_ip = match_hostname(ipaddr,
+ hp, strlen(hp));
+ /*
+ * Negative match causes an immediate "deny".
+ * Positive match causes us to break out
+ * of the loop (allowing a fallthrough).
+ */
+ if (match_name < 0 || match_ip < 0) {
+ free(cap_hlist);
+ login_close(lc);
+ return 0;
+ }
+ if (match_name > 0 || match_ip > 0)
+ break;
+ }
+ free(cap_hlist);
+ if (hp == NULL) {
+ login_close(lc);
+ return 0;
+ }
+ }
+
+ login_close(lc);
+#endif
+
+ /*
+ * Get the shell from the password data. An empty shell field is
+ * legal, and means /bin/sh.
+ */
+ shell = (pw->pw_shell[0] == '\0') ? _PATH_BSHELL : pw->pw_shell;
+
+ /*
+ * deny if shell does not exists or is not executable.
+ * XXX Should check to see if it is executable by the
+ * XXX requesting user. --thorpej
+ */
+ if (stat(shell, &st) != 0)
+ return 0;
+ if (S_ISREG(st.st_mode) == 0 ||
+ (st.st_mode & (S_IXOTH|S_IXUSR|S_IXGRP)) == 0)
+ return 0;
+ /*
+ * XXX Consider nuking {Allow,Deny}{Users,Groups}. We have the
+ * XXX login_cap(3) mechanism which covers all other types of
+ * XXX logins, too.
+ */
+
+ /* Return false if user is listed in DenyUsers */
+ if (options.num_deny_users > 0) {
+ for (i = 0; i < options.num_deny_users; i++)
+ if (match_pattern(pw->pw_name, options.deny_users[i]))
+ return 0;
+ }
+ /* Return false if AllowUsers isn't empty and user isn't listed there */
+ if (options.num_allow_users > 0) {
+ for (i = 0; i < options.num_allow_users; i++)
+ if (match_pattern(pw->pw_name, options.allow_users[i]))
+ break;
+ /* i < options.num_allow_users iff we break for loop */
+ if (i >= options.num_allow_users)
+ return 0;
+ }
+ if (options.num_deny_groups > 0 || options.num_allow_groups > 0) {
+ /* Get the user's group access list (primary and supplementary) */
+ if (ga_init(pw->pw_name, pw->pw_gid) == 0)
+ return 0;
+
+ /* Return false if one of user's groups is listed in DenyGroups */
+ if (options.num_deny_groups > 0)
+ if (ga_match(options.deny_groups,
+ options.num_deny_groups)) {
+ ga_free();
+ return 0;
+ }
+ /*
+ * Return false if AllowGroups isn't empty and one of user's groups
+ * isn't listed there
+ */
+ if (options.num_allow_groups > 0)
+ if (!ga_match(options.allow_groups,
+ options.num_allow_groups)) {
+ ga_free();
+ return 0;
+ }
+ ga_free();
+ }
+ /* We found no reason not to let this user try to log on... */
+ return 1;
+}
+
+Authctxt *
+authctxt_new(void)
+{
+ Authctxt *authctxt = xmalloc(sizeof(*authctxt));
+ memset(authctxt, 0, sizeof(*authctxt));
+ return authctxt;
+}
+
+struct passwd *
+pwcopy(struct passwd *pw)
+{
+ struct passwd *copy = xmalloc(sizeof(*copy));
+ memset(copy, 0, sizeof(*copy));
+ copy->pw_name = xstrdup(pw->pw_name);
+ copy->pw_passwd = xstrdup(pw->pw_passwd);
+ copy->pw_uid = pw->pw_uid;
+ copy->pw_gid = pw->pw_gid;
+ copy->pw_class = xstrdup(pw->pw_class);
+ copy->pw_dir = xstrdup(pw->pw_dir);
+ copy->pw_shell = xstrdup(pw->pw_shell);
+ return copy;
+}
+
+void
+auth_log(Authctxt *authctxt, int authenticated, char *method, char *info)
+{
+ void (*authlog) (const char *fmt,...) = verbose;
+ char *authmsg;
+
+ /* Raise logging level */
+ if (authenticated == 1 ||
+ !authctxt->valid ||
+ authctxt->failures >= AUTH_FAIL_LOG ||
+ strcmp(method, "password") == 0)
+ authlog = log;
+
+ if (authctxt->postponed)
+ authmsg = "Postponed";
+ else
+ authmsg = authenticated ? "Accepted" : "Failed";
+
+ authlog("%s %s for %s%.100s from %.200s port %d%s",
+ authmsg,
+ method,
+ authctxt->valid ? "" : "illegal user ",
+ authctxt->valid && authctxt->pw->pw_uid == 0 ? "ROOT" : authctxt->user,
+ get_remote_ipaddr(),
+ get_remote_port(),
+ info);
+}
+
+/*
+ * Check whether root logins are disallowed.
+ */
+int
+auth_root_allowed(char *method)
+{
+ switch (options.permit_root_login) {
+ case PERMIT_YES:
+ return 1;
+ break;
+ case PERMIT_NO_PASSWD:
+ if (strcmp(method, "password") != 0)
+ return 1;
+ break;
+ case PERMIT_FORCED_ONLY:
+ if (forced_command) {
+ log("Root login accepted for forced command.");
+ return 1;
+ }
+ break;
+ }
+ log("ROOT LOGIN REFUSED FROM %.200s", get_remote_ipaddr());
+ return 0;
+}
diff -r a947236abede -r 6107af742467 crypto/dist/ssh/authfile.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/crypto/dist/ssh/authfile.c Mon Feb 26 20:26:40 2001 +0000
@@ -0,0 +1,593 @@
+/*
+ * Author: Tatu Ylonen <ylo%cs.hut.fi@localhost>
+ * Copyright (c) 1995 Tatu Ylonen <ylo%cs.hut.fi@localhost>, Espoo, Finland
+ * All rights reserved
+ * This file contains functions for reading and writing identity files, and
+ * for reading the passphrase from the user.
+ *
+ * As far as I am concerned, the code I have written for this software
+ * can be used freely for any purpose. Any derived versions of this
+ * software must be clearly marked as such, and if the derived work is
+ * incompatible with the protocol description in the RFC file, it must be
+ * called by a name other than "ssh" or "Secure Shell".
Home |
Main Index |
Thread Index |
Old Index