mirror of
				https://github.com/PowerShell/openssh-portable.git
				synced 2025-10-31 11:34:38 +01:00 
			
		
		
		
	upstream: plumb ssh_conn_info through to sshconnect.c; feedback/ok
markus@ OpenBSD-Commit-ID: e8d14a09cda3f1dc55df08f8a4889beff74e68b0
This commit is contained in:
		
							parent
							
								
									729b05f59d
								
							
						
					
					
						commit
						0f504f592d
					
				
							
								
								
									
										35
									
								
								ssh.c
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								ssh.c
									
									
									
									
									
								
							| @ -1,4 +1,4 @@ | |||||||
| /* $OpenBSD: ssh.c,v 1.545 2020/12/20 23:38:00 djm Exp $ */ | /* $OpenBSD: ssh.c,v 1.546 2020/12/20 23:40:19 djm Exp $ */ | ||||||
| /*
 | /*
 | ||||||
|  * Author: Tatu Ylonen <ylo@cs.hut.fi> |  * Author: Tatu Ylonen <ylo@cs.hut.fi> | ||||||
|  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland |  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland | ||||||
| @ -227,15 +227,6 @@ tilde_expand_paths(char **paths, u_int num_paths) | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #define DEFAULT_CLIENT_PERCENT_EXPAND_ARGS \ |  | ||||||
|     "C", cinfo->conn_hash_hex, \ |  | ||||||
|     "L", cinfo->shorthost, \ |  | ||||||
|     "i", cinfo->uidstr, \ |  | ||||||
|     "k", cinfo->keyalias, \ |  | ||||||
|     "l", cinfo->thishost, \ |  | ||||||
|     "n", cinfo->host_arg, \ |  | ||||||
|     "p", cinfo->portstr |  | ||||||
| 
 |  | ||||||
| /*
 | /*
 | ||||||
|  * Expands the set of percent_expand options used by the majority of keywords |  * Expands the set of percent_expand options used by the majority of keywords | ||||||
|  * in the client that support percent expansion. |  * in the client that support percent expansion. | ||||||
| @ -246,13 +237,7 @@ default_client_percent_expand(const char *str, | |||||||
|     const struct ssh_conn_info *cinfo) |     const struct ssh_conn_info *cinfo) | ||||||
| { | { | ||||||
| 	return percent_expand(str, | 	return percent_expand(str, | ||||||
| 	    /* values from statics above */ | 	    DEFAULT_CLIENT_PERCENT_EXPAND_ARGS(cinfo), | ||||||
| 	    DEFAULT_CLIENT_PERCENT_EXPAND_ARGS, |  | ||||||
| 	    /* values from arguments */ |  | ||||||
| 	    "d", cinfo->homedir, |  | ||||||
| 	    "h", cinfo->remhost, |  | ||||||
| 	    "r", cinfo->remuser, |  | ||||||
| 	    "u", cinfo->locuser, |  | ||||||
| 	    (char *)NULL); | 	    (char *)NULL); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -268,13 +253,7 @@ default_client_percent_dollar_expand(const char *str, | |||||||
| 	char *ret; | 	char *ret; | ||||||
| 
 | 
 | ||||||
| 	ret = percent_dollar_expand(str, | 	ret = percent_dollar_expand(str, | ||||||
| 	    /* values from statics above */ | 	    DEFAULT_CLIENT_PERCENT_EXPAND_ARGS(cinfo), | ||||||
| 	    DEFAULT_CLIENT_PERCENT_EXPAND_ARGS, |  | ||||||
| 	    /* values from arguments */ |  | ||||||
| 	    "d", cinfo->homedir, |  | ||||||
| 	    "h", cinfo->remhost, |  | ||||||
| 	    "r", cinfo->remuser, |  | ||||||
| 	    "u", cinfo->locuser, |  | ||||||
| 	    (char *)NULL); | 	    (char *)NULL); | ||||||
| 	if (ret == NULL) | 	if (ret == NULL) | ||||||
| 		fatal("invalid environment variable expansion"); | 		fatal("invalid environment variable expansion"); | ||||||
| @ -1670,7 +1649,7 @@ main(int ac, char **av) | |||||||
| 
 | 
 | ||||||
| 	/* Log into the remote system.  Never returns if the login fails. */ | 	/* Log into the remote system.  Never returns if the login fails. */ | ||||||
| 	ssh_login(ssh, &sensitive_data, host, (struct sockaddr *)&hostaddr, | 	ssh_login(ssh, &sensitive_data, host, (struct sockaddr *)&hostaddr, | ||||||
| 	    options.port, pw, timeout_ms); | 	    options.port, pw, timeout_ms, cinfo); | ||||||
| 
 | 
 | ||||||
| 	if (ssh_packet_connection_is_on_socket(ssh)) { | 	if (ssh_packet_connection_is_on_socket(ssh)) { | ||||||
| 		verbose("Authenticated to %s ([%s]:%d).", host, | 		verbose("Authenticated to %s ([%s]:%d).", host, | ||||||
| @ -2088,11 +2067,7 @@ ssh_session2(struct ssh *ssh, const struct ssh_conn_info *cinfo) | |||||||
| 		debug3("expanding LocalCommand: %s", options.local_command); | 		debug3("expanding LocalCommand: %s", options.local_command); | ||||||
| 		cp = options.local_command; | 		cp = options.local_command; | ||||||
| 		options.local_command = percent_expand(cp, | 		options.local_command = percent_expand(cp, | ||||||
| 		    DEFAULT_CLIENT_PERCENT_EXPAND_ARGS, | 		    DEFAULT_CLIENT_PERCENT_EXPAND_ARGS(cinfo), | ||||||
| 		    "d", cinfo->homedir, |  | ||||||
| 		    "h", cinfo->remhost, |  | ||||||
| 		    "r", cinfo->remuser, |  | ||||||
| 		    "u", cinfo->locuser, |  | ||||||
| 		    "T", tun_fwd_ifname == NULL ? "NONE" : tun_fwd_ifname, | 		    "T", tun_fwd_ifname == NULL ? "NONE" : tun_fwd_ifname, | ||||||
| 		    (char *)NULL); | 		    (char *)NULL); | ||||||
| 		debug3("expanded LocalCommand: %s", options.local_command); | 		debug3("expanded LocalCommand: %s", options.local_command); | ||||||
|  | |||||||
							
								
								
									
										29
									
								
								sshconnect.c
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								sshconnect.c
									
									
									
									
									
								
							| @ -1,4 +1,4 @@ | |||||||
| /* $OpenBSD: sshconnect.c,v 1.347 2020/12/20 23:38:00 djm Exp $ */ | /* $OpenBSD: sshconnect.c,v 1.348 2020/12/20 23:40:19 djm Exp $ */ | ||||||
| /*
 | /*
 | ||||||
|  * Author: Tatu Ylonen <ylo@cs.hut.fi> |  * Author: Tatu Ylonen <ylo@cs.hut.fi> | ||||||
|  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland |  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland | ||||||
| @ -873,8 +873,9 @@ other_hostkeys_message(const char *host, const char *ip, | |||||||
| #define RDONLY	1 | #define RDONLY	1 | ||||||
| #define ROQUIET	2 | #define ROQUIET	2 | ||||||
| static int | static int | ||||||
| check_host_key(char *hostname, struct sockaddr *hostaddr, u_short port, | check_host_key(char *hostname, const struct ssh_conn_info *cinfo, | ||||||
|     struct sshkey *host_key, int readonly, |     struct sockaddr *hostaddr, u_short port, | ||||||
|  |     struct sshkey *host_key, int readonly, int clobber_port, | ||||||
|     char **user_hostfiles, u_int num_user_hostfiles, |     char **user_hostfiles, u_int num_user_hostfiles, | ||||||
|     char **system_hostfiles, u_int num_system_hostfiles) |     char **system_hostfiles, u_int num_system_hostfiles) | ||||||
| { | { | ||||||
| @ -912,7 +913,8 @@ check_host_key(char *hostname, struct sockaddr *hostaddr, u_short port, | |||||||
| 	 * Prepare the hostname and address strings used for hostkey lookup. | 	 * Prepare the hostname and address strings used for hostkey lookup. | ||||||
| 	 * In some cases, these will have a port number appended. | 	 * In some cases, these will have a port number appended. | ||||||
| 	 */ | 	 */ | ||||||
| 	get_hostfile_hostname_ipaddr(hostname, hostaddr, port, &host, &ip); | 	get_hostfile_hostname_ipaddr(hostname, hostaddr, | ||||||
|  | 	    clobber_port ? 0 : port, &host, &ip); | ||||||
| 
 | 
 | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * Turn off check_host_ip if the connection is to localhost, via proxy | 	 * Turn off check_host_ip if the connection is to localhost, via proxy | ||||||
| @ -1021,10 +1023,11 @@ check_host_key(char *hostname, struct sockaddr *hostaddr, u_short port, | |||||||
| 		break; | 		break; | ||||||
| 	case HOST_NEW: | 	case HOST_NEW: | ||||||
| 		if (options.host_key_alias == NULL && port != 0 && | 		if (options.host_key_alias == NULL && port != 0 && | ||||||
| 		    port != SSH_DEFAULT_PORT) { | 		    port != SSH_DEFAULT_PORT && !clobber_port) { | ||||||
| 			debug("checking without port identifier"); | 			debug("checking without port identifier"); | ||||||
| 			if (check_host_key(hostname, hostaddr, 0, host_key, | 			if (check_host_key(hostname, cinfo, hostaddr, 0, | ||||||
| 			    ROQUIET, user_hostfiles, num_user_hostfiles, | 			    host_key, ROQUIET, 1, | ||||||
|  | 			    user_hostfiles, num_user_hostfiles, | ||||||
| 			    system_hostfiles, num_system_hostfiles) == 0) { | 			    system_hostfiles, num_system_hostfiles) == 0) { | ||||||
| 				debug("found matching key w/out port"); | 				debug("found matching key w/out port"); | ||||||
| 				break; | 				break; | ||||||
| @ -1338,7 +1341,8 @@ fail: | |||||||
| 
 | 
 | ||||||
| /* returns 0 if key verifies or -1 if key does NOT verify */ | /* returns 0 if key verifies or -1 if key does NOT verify */ | ||||||
| int | int | ||||||
| verify_host_key(char *host, struct sockaddr *hostaddr, struct sshkey *host_key) | verify_host_key(char *host, struct sockaddr *hostaddr, struct sshkey *host_key, | ||||||
|  |     const struct ssh_conn_info *cinfo) | ||||||
| { | { | ||||||
| 	u_int i; | 	u_int i; | ||||||
| 	int r = -1, flags = 0; | 	int r = -1, flags = 0; | ||||||
| @ -1432,8 +1436,8 @@ verify_host_key(char *host, struct sockaddr *hostaddr, struct sshkey *host_key) | |||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	r = check_host_key(host, hostaddr, options.port, host_key, RDRW, | 	r = check_host_key(host, cinfo, hostaddr, options.port, host_key, | ||||||
| 	    options.user_hostfiles, options.num_user_hostfiles, | 	    RDRW, 0, options.user_hostfiles, options.num_user_hostfiles, | ||||||
| 	    options.system_hostfiles, options.num_system_hostfiles); | 	    options.system_hostfiles, options.num_system_hostfiles); | ||||||
| 
 | 
 | ||||||
| out: | out: | ||||||
| @ -1457,7 +1461,8 @@ out: | |||||||
|  */ |  */ | ||||||
| void | void | ||||||
| ssh_login(struct ssh *ssh, Sensitive *sensitive, const char *orighost, | ssh_login(struct ssh *ssh, Sensitive *sensitive, const char *orighost, | ||||||
|     struct sockaddr *hostaddr, u_short port, struct passwd *pw, int timeout_ms) |     struct sockaddr *hostaddr, u_short port, struct passwd *pw, int timeout_ms, | ||||||
|  |     const struct ssh_conn_info *cinfo) | ||||||
| { | { | ||||||
| 	char *host; | 	char *host; | ||||||
| 	char *server_user, *local_user; | 	char *server_user, *local_user; | ||||||
| @ -1480,7 +1485,7 @@ ssh_login(struct ssh *ssh, Sensitive *sensitive, const char *orighost, | |||||||
| 	/* key exchange */ | 	/* key exchange */ | ||||||
| 	/* authenticate user */ | 	/* authenticate user */ | ||||||
| 	debug("Authenticating to %s:%d as '%s'", host, port, server_user); | 	debug("Authenticating to %s:%d as '%s'", host, port, server_user); | ||||||
| 	ssh_kex2(ssh, host, hostaddr, port); | 	ssh_kex2(ssh, host, hostaddr, port, cinfo); | ||||||
| 	ssh_userauth2(ssh, local_user, server_user, host, sensitive); | 	ssh_userauth2(ssh, local_user, server_user, host, sensitive); | ||||||
| 	free(local_user); | 	free(local_user); | ||||||
| 	free(host); | 	free(host); | ||||||
|  | |||||||
							
								
								
									
										27
									
								
								sshconnect.h
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								sshconnect.h
									
									
									
									
									
								
							| @ -1,4 +1,4 @@ | |||||||
| /* $OpenBSD: sshconnect.h,v 1.44 2020/12/17 23:26:11 djm Exp $ */ | /* $OpenBSD: sshconnect.h,v 1.45 2020/12/20 23:40:19 djm Exp $ */ | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Copyright (c) 2000 Markus Friedl.  All rights reserved. |  * Copyright (c) 2000 Markus Friedl.  All rights reserved. | ||||||
| @ -46,6 +46,22 @@ struct ssh_conn_info { | |||||||
| 
 | 
 | ||||||
| struct addrinfo; | struct addrinfo; | ||||||
| struct ssh; | struct ssh; | ||||||
|  | struct hostkeys; | ||||||
|  | struct ssh_conn_info; | ||||||
|  | 
 | ||||||
|  | /* default argument for client percent expansions */ | ||||||
|  | #define DEFAULT_CLIENT_PERCENT_EXPAND_ARGS(conn_info) \ | ||||||
|  | 	"C", conn_info->conn_hash_hex, \ | ||||||
|  | 	"L", conn_info->shorthost, \ | ||||||
|  | 	"i", conn_info->uidstr, \ | ||||||
|  | 	"k", conn_info->keyalias, \ | ||||||
|  | 	"l", conn_info->thishost, \ | ||||||
|  | 	"n", conn_info->host_arg, \ | ||||||
|  | 	"p", conn_info->portstr, \ | ||||||
|  | 	"d", conn_info->homedir, \ | ||||||
|  | 	"h", conn_info->remhost, \ | ||||||
|  | 	"r", conn_info->remuser, \ | ||||||
|  | 	"u", conn_info->locuser | ||||||
| 
 | 
 | ||||||
| int	 ssh_connect(struct ssh *, const char *, const char *, | int	 ssh_connect(struct ssh *, const char *, const char *, | ||||||
| 	    struct addrinfo *, struct sockaddr_storage *, u_short, | 	    struct addrinfo *, struct sockaddr_storage *, u_short, | ||||||
| @ -53,14 +69,17 @@ int	 ssh_connect(struct ssh *, const char *, const char *, | |||||||
| void	 ssh_kill_proxy_command(void); | void	 ssh_kill_proxy_command(void); | ||||||
| 
 | 
 | ||||||
| void	 ssh_login(struct ssh *, Sensitive *, const char *, | void	 ssh_login(struct ssh *, Sensitive *, const char *, | ||||||
|     struct sockaddr *, u_short, struct passwd *, int); |     struct sockaddr *, u_short, struct passwd *, int, | ||||||
|  |     const struct ssh_conn_info *); | ||||||
| 
 | 
 | ||||||
| int	 verify_host_key(char *, struct sockaddr *, struct sshkey *); | int	 verify_host_key(char *, struct sockaddr *, struct sshkey *, | ||||||
|  |     const struct ssh_conn_info *); | ||||||
| 
 | 
 | ||||||
| void	 get_hostfile_hostname_ipaddr(char *, struct sockaddr *, u_short, | void	 get_hostfile_hostname_ipaddr(char *, struct sockaddr *, u_short, | ||||||
|     char **, char **); |     char **, char **); | ||||||
| 
 | 
 | ||||||
| void	 ssh_kex2(struct ssh *ssh, char *, struct sockaddr *, u_short); | void	 ssh_kex2(struct ssh *ssh, char *, struct sockaddr *, u_short, | ||||||
|  |     const struct ssh_conn_info *); | ||||||
| 
 | 
 | ||||||
| void	 ssh_userauth2(struct ssh *ssh, const char *, const char *, | void	 ssh_userauth2(struct ssh *ssh, const char *, const char *, | ||||||
|     char *, Sensitive *); |     char *, Sensitive *); | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| /* $OpenBSD: sshconnect2.c,v 1.337 2020/12/20 23:36:51 djm Exp $ */ | /* $OpenBSD: sshconnect2.c,v 1.338 2020/12/20 23:40:19 djm Exp $ */ | ||||||
| /*
 | /*
 | ||||||
|  * Copyright (c) 2000 Markus Friedl.  All rights reserved. |  * Copyright (c) 2000 Markus Friedl.  All rights reserved. | ||||||
|  * Copyright (c) 2008 Damien Miller.  All rights reserved. |  * Copyright (c) 2008 Damien Miller.  All rights reserved. | ||||||
| @ -92,13 +92,15 @@ extern Options options; | |||||||
| u_char *session_id2 = NULL; | u_char *session_id2 = NULL; | ||||||
| u_int session_id2_len = 0; | u_int session_id2_len = 0; | ||||||
| 
 | 
 | ||||||
| char *xxx_host; | static char *xxx_host; | ||||||
| struct sockaddr *xxx_hostaddr; | static struct sockaddr *xxx_hostaddr; | ||||||
|  | static const struct ssh_conn_info *xxx_conn_info; | ||||||
| 
 | 
 | ||||||
| static int | static int | ||||||
| verify_host_key_callback(struct sshkey *hostkey, struct ssh *ssh) | verify_host_key_callback(struct sshkey *hostkey, struct ssh *ssh) | ||||||
| { | { | ||||||
| 	if (verify_host_key(xxx_host, xxx_hostaddr, hostkey) == -1) | 	if (verify_host_key(xxx_host, xxx_hostaddr, hostkey, | ||||||
|  | 	    xxx_conn_info) == -1) | ||||||
| 		fatal("Host key verification failed."); | 		fatal("Host key verification failed."); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| @ -116,7 +118,8 @@ first_alg(const char *algs) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static char * | static char * | ||||||
| order_hostkeyalgs(char *host, struct sockaddr *hostaddr, u_short port) | order_hostkeyalgs(char *host, struct sockaddr *hostaddr, u_short port, | ||||||
|  |     const struct ssh_conn_info *cinfo) | ||||||
| { | { | ||||||
| 	char *oavail = NULL, *avail = NULL, *first = NULL, *last = NULL; | 	char *oavail = NULL, *avail = NULL, *first = NULL, *last = NULL; | ||||||
| 	char *alg = NULL, *hostname = NULL, *ret = NULL, *best = NULL; | 	char *alg = NULL, *hostname = NULL, *ret = NULL, *best = NULL; | ||||||
| @ -208,7 +211,8 @@ order_hostkeyalgs(char *host, struct sockaddr *hostaddr, u_short port) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port) | ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port, | ||||||
|  |     const struct ssh_conn_info *cinfo) | ||||||
| { | { | ||||||
| 	char *myproposal[PROPOSAL_MAX] = { KEX_CLIENT }; | 	char *myproposal[PROPOSAL_MAX] = { KEX_CLIENT }; | ||||||
| 	char *s, *all_key; | 	char *s, *all_key; | ||||||
| @ -216,6 +220,7 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port) | |||||||
| 
 | 
 | ||||||
| 	xxx_host = host; | 	xxx_host = host; | ||||||
| 	xxx_hostaddr = hostaddr; | 	xxx_hostaddr = hostaddr; | ||||||
|  | 	xxx_conn_info = cinfo; | ||||||
| 
 | 
 | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * If the user has not specified HostkeyAlgorithms, or has only | 	 * If the user has not specified HostkeyAlgorithms, or has only | ||||||
| @ -250,7 +255,7 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port) | |||||||
| 		/* Query known_hosts and prefer algorithms that appear there */ | 		/* Query known_hosts and prefer algorithms that appear there */ | ||||||
| 		myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = | 		myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = | ||||||
| 		    compat_pkalg_proposal( | 		    compat_pkalg_proposal( | ||||||
| 		    order_hostkeyalgs(host, hostaddr, port)); | 		    order_hostkeyalgs(host, hostaddr, port, cinfo)); | ||||||
| 	} else { | 	} else { | ||||||
| 		/* Use specified HostkeyAlgorithms exactly */ | 		/* Use specified HostkeyAlgorithms exactly */ | ||||||
| 		myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = | 		myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user