2 * Author: Tatu Ylonen <ylo@cs.hut.fi>
3 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
5 * As far as I am concerned, the code I have written for this software
6 * can be used freely for any purpose. Any derived versions of this
7 * software must be clearly marked as such, and if the derived work is
8 * incompatible with the protocol description in the RFC file, it must be
9 * called by a name other than "ssh" or "Secure Shell".
13 RCSID("$OpenBSD: auth-options.c,v 1.31 2005/03/10 22:40:38 deraadt Exp $");
20 #include "auth-options.h"
23 #include "monitor_wrap.h"
26 /* Flags set authorized_keys flags */
27 int no_port_forwarding_flag
= 0;
28 int no_agent_forwarding_flag
= 0;
29 int no_x11_forwarding_flag
= 0;
32 /* "command=" option. */
33 char *forced_command
= NULL
;
35 /* "environment=" options. */
36 struct envstring
*custom_environment
= NULL
;
38 extern ServerOptions options
;
41 auth_clear_options(void)
43 no_agent_forwarding_flag
= 0;
44 no_port_forwarding_flag
= 0;
46 no_x11_forwarding_flag
= 0;
47 while (custom_environment
) {
48 struct envstring
*ce
= custom_environment
;
49 custom_environment
= ce
->next
;
54 xfree(forced_command
);
55 forced_command
= NULL
;
57 channel_clear_permitted_opens();
62 * return 1 if access is granted, 0 if not.
63 * side effect: sets key option flags
66 auth_parse_options(struct passwd
*pw
, char *opts
, char *file
, u_long linenum
)
77 while (*opts
&& *opts
!= ' ' && *opts
!= '\t') {
78 cp
= "no-port-forwarding";
79 if (strncasecmp(opts
, cp
, strlen(cp
)) == 0) {
80 auth_debug_add("Port forwarding disabled.");
81 no_port_forwarding_flag
= 1;
85 cp
= "no-agent-forwarding";
86 if (strncasecmp(opts
, cp
, strlen(cp
)) == 0) {
87 auth_debug_add("Agent forwarding disabled.");
88 no_agent_forwarding_flag
= 1;
92 cp
= "no-X11-forwarding";
93 if (strncasecmp(opts
, cp
, strlen(cp
)) == 0) {
94 auth_debug_add("X11 forwarding disabled.");
95 no_x11_forwarding_flag
= 1;
100 if (strncasecmp(opts
, cp
, strlen(cp
)) == 0) {
101 auth_debug_add("Pty allocation disabled.");
107 if (strncasecmp(opts
, cp
, strlen(cp
)) == 0) {
109 forced_command
= xmalloc(strlen(opts
) + 1);
114 if (*opts
== '\\' && opts
[1] == '"') {
116 forced_command
[i
++] = '"';
119 forced_command
[i
++] = *opts
++;
122 debug("%.100s, line %lu: missing end quote",
124 auth_debug_add("%.100s, line %lu: missing end quote",
126 xfree(forced_command
);
127 forced_command
= NULL
;
130 forced_command
[i
] = 0;
131 auth_debug_add("Forced command: %.900s", forced_command
);
135 cp
= "environment=\"";
136 if (options
.permit_user_env
&&
137 strncasecmp(opts
, cp
, strlen(cp
)) == 0) {
139 struct envstring
*new_envstring
;
142 s
= xmalloc(strlen(opts
) + 1);
147 if (*opts
== '\\' && opts
[1] == '"') {
155 debug("%.100s, line %lu: missing end quote",
157 auth_debug_add("%.100s, line %lu: missing end quote",
163 auth_debug_add("Adding to environment: %.900s", s
);
164 debug("Adding to environment: %.900s", s
);
166 new_envstring
= xmalloc(sizeof(struct envstring
));
167 new_envstring
->s
= s
;
168 new_envstring
->next
= custom_environment
;
169 custom_environment
= new_envstring
;
173 if (strncasecmp(opts
, cp
, strlen(cp
)) == 0) {
174 const char *remote_ip
= get_remote_ipaddr();
175 const char *remote_host
= get_canonical_hostname(
177 char *patterns
= xmalloc(strlen(opts
) + 1);
184 if (*opts
== '\\' && opts
[1] == '"') {
189 patterns
[i
++] = *opts
++;
192 debug("%.100s, line %lu: missing end quote",
194 auth_debug_add("%.100s, line %lu: missing end quote",
201 if (match_host_and_ip(remote_host
, remote_ip
,
204 logit("Authentication tried for %.100s with "
205 "correct key but not from a permitted "
206 "host (host=%.200s, ip=%.200s).",
207 pw
->pw_name
, remote_host
, remote_ip
);
208 auth_debug_add("Your host '%.200s' is not "
209 "permitted to use this key for login.",
215 /* Host name matches. */
218 cp
= "permitopen=\"";
219 if (strncasecmp(opts
, cp
, strlen(cp
)) == 0) {
222 char *patterns
= xmalloc(strlen(opts
) + 1);
229 if (*opts
== '\\' && opts
[1] == '"') {
234 patterns
[i
++] = *opts
++;
237 debug("%.100s, line %lu: missing end quote",
239 auth_debug_add("%.100s, line %lu: missing "
240 "end quote", file
, linenum
);
248 if (host
== NULL
|| strlen(host
) >= NI_MAXHOST
) {
249 debug("%.100s, line %lu: Bad permitopen "
250 "specification <%.100s>", file
, linenum
,
252 auth_debug_add("%.100s, line %lu: "
253 "Bad permitopen specification", file
,
258 host
= cleanhostname(host
);
259 if (p
== NULL
|| (port
= a2port(p
)) == 0) {
260 debug("%.100s, line %lu: Bad permitopen port "
261 "<%.100s>", file
, linenum
, p
? p
: "");
262 auth_debug_add("%.100s, line %lu: "
263 "Bad permitopen port", file
, linenum
);
267 if (options
.allow_tcp_forwarding
)
268 channel_add_permitted_opens(host
, port
);
274 * Skip the comma, and move to the next option
275 * (or break out if there are no more).
278 fatal("Bugs in auth-options.c option processing.");
279 if (*opts
== ' ' || *opts
== '\t')
280 break; /* End of options. */
284 /* Process the next option. */
294 logit("Bad options in %.100s file, line %lu: %.50s",
295 file
, linenum
, opts
);
296 auth_debug_add("Bad options in %.100s file, line %lu: %.50s",
297 file
, linenum
, opts
);