|
Lines 115-129
typedef struct {
Link Here
|
| 115 |
|
115 |
|
| 116 |
/* List of all permitted host/port pairs to connect by the user. */ |
116 |
/* List of all permitted host/port pairs to connect by the user. */ |
| 117 |
static ForwardPermission *permitted_opens = NULL; |
117 |
static ForwardPermission *permitted_opens = NULL; |
|
|
118 |
static ForwardPermission *permitted_remote_opens = NULL; |
| 118 |
|
119 |
|
| 119 |
/* List of all permitted host/port pairs to connect by the admin. */ |
120 |
/* List of all permitted host/port pairs to connect by the admin. */ |
| 120 |
static ForwardPermission *permitted_adm_opens = NULL; |
121 |
static ForwardPermission *permitted_adm_opens = NULL; |
|
|
122 |
static ForwardPermission *permitted_adm_remote_opens = NULL; |
| 121 |
|
123 |
|
| 122 |
/* Number of permitted host/port pairs in the array permitted by the user. */ |
124 |
/* Number of permitted host/port pairs in the array permitted by the user. */ |
| 123 |
static int num_permitted_opens = 0; |
125 |
static int num_permitted_opens = 0; |
|
|
126 |
static int num_permitted_remote_opens = 0; |
| 124 |
|
127 |
|
| 125 |
/* Number of permitted host/port pair in the array permitted by the admin. */ |
128 |
/* Number of permitted host/port pair in the array permitted by the admin. */ |
| 126 |
static int num_adm_permitted_opens = 0; |
129 |
static int num_adm_permitted_opens = 0; |
|
|
130 |
static int num_adm_permitted_remote_opens = 0; |
| 127 |
|
131 |
|
| 128 |
/* special-case port number meaning allow any port */ |
132 |
/* special-case port number meaning allow any port */ |
| 129 |
#define FWD_PERMIT_ANY_PORT 0 |
133 |
#define FWD_PERMIT_ANY_PORT 0 |
|
Lines 134-139
static int num_adm_permitted_opens = 0;
Link Here
|
| 134 |
* anything after logging in anyway. |
138 |
* anything after logging in anyway. |
| 135 |
*/ |
139 |
*/ |
| 136 |
static int all_opens_permitted = 0; |
140 |
static int all_opens_permitted = 0; |
|
|
141 |
static int all_remote_opens_permitted = 0; |
| 137 |
|
142 |
|
| 138 |
|
143 |
|
| 139 |
/* -- X11 forwarding */ |
144 |
/* -- X11 forwarding */ |
|
Lines 3124-3129
channel_permit_all_opens(void)
Link Here
|
| 3124 |
if (num_permitted_opens == 0) |
3129 |
if (num_permitted_opens == 0) |
| 3125 |
all_opens_permitted = 1; |
3130 |
all_opens_permitted = 1; |
| 3126 |
} |
3131 |
} |
|
|
3132 |
void |
| 3133 |
channel_permit_all_remote_opens(void) |
| 3134 |
{ |
| 3135 |
if (num_permitted_remote_opens == 0) |
| 3136 |
all_remote_opens_permitted = 1; |
| 3137 |
} |
| 3138 |
|
| 3127 |
|
3139 |
|
| 3128 |
void |
3140 |
void |
| 3129 |
channel_add_permitted_opens(char *host, int port) |
3141 |
channel_add_permitted_opens(char *host, int port) |
|
Lines 3139-3144
channel_add_permitted_opens(char *host, int port)
Link Here
|
| 3139 |
all_opens_permitted = 0; |
3151 |
all_opens_permitted = 0; |
| 3140 |
} |
3152 |
} |
| 3141 |
|
3153 |
|
|
|
3154 |
void |
| 3155 |
channel_add_permitted_remote_opens(int port) |
| 3156 |
{ |
| 3157 |
debug("allow remote port forwarding %d", port); |
| 3158 |
|
| 3159 |
permitted_remote_opens = xrealloc(permitted_remote_opens, |
| 3160 |
num_permitted_remote_opens + 1, sizeof(*permitted_remote_opens)); |
| 3161 |
permitted_remote_opens[num_permitted_opens].listen_port = port; |
| 3162 |
num_permitted_remote_opens++; |
| 3163 |
|
| 3164 |
all_remote_opens_permitted = 0; |
| 3165 |
} |
| 3166 |
|
| 3142 |
/* |
3167 |
/* |
| 3143 |
* Update the listen port for a dynamic remote forward, after |
3168 |
* Update the listen port for a dynamic remote forward, after |
| 3144 |
* the actual 'newport' has been allocated. If 'newport' < 0 is |
3169 |
* the actual 'newport' has been allocated. If 'newport' < 0 is |
|
Lines 3181-3186
channel_add_adm_permitted_opens(char *host, int port)
Link Here
|
| 3181 |
return ++num_adm_permitted_opens; |
3206 |
return ++num_adm_permitted_opens; |
| 3182 |
} |
3207 |
} |
| 3183 |
|
3208 |
|
|
|
3209 |
int |
| 3210 |
channel_add_adm_permitted_remote_opens(int port) |
| 3211 |
{ |
| 3212 |
debug("config allows remote port forwarding, port %d", port); |
| 3213 |
|
| 3214 |
permitted_adm_remote_opens = xrealloc(permitted_adm_remote_opens, |
| 3215 |
num_adm_permitted_remote_opens + 1, sizeof(*permitted_adm_remote_opens)); |
| 3216 |
permitted_adm_remote_opens[num_adm_permitted_remote_opens].listen_port = port; |
| 3217 |
return ++num_adm_permitted_remote_opens; |
| 3218 |
} |
| 3219 |
|
| 3220 |
|
| 3184 |
void |
3221 |
void |
| 3185 |
channel_disable_adm_local_opens(void) |
3222 |
channel_disable_adm_local_opens(void) |
| 3186 |
{ |
3223 |
{ |
|
Lines 3191-3196
channel_disable_adm_local_opens(void)
Link Here
|
| 3191 |
} |
3228 |
} |
| 3192 |
|
3229 |
|
| 3193 |
void |
3230 |
void |
|
|
3231 |
channel_disable_adm_remote_opens(void) |
| 3232 |
{ |
| 3233 |
channel_clear_adm_permitted_remote_opens(); |
| 3234 |
permitted_adm_remote_opens = xmalloc(sizeof(*permitted_adm_remote_opens)); |
| 3235 |
permitted_adm_remote_opens[num_adm_permitted_remote_opens].host_to_connect = NULL; |
| 3236 |
num_adm_permitted_remote_opens = 1; |
| 3237 |
} |
| 3238 |
|
| 3239 |
void |
| 3194 |
channel_clear_permitted_opens(void) |
3240 |
channel_clear_permitted_opens(void) |
| 3195 |
{ |
3241 |
{ |
| 3196 |
int i; |
3242 |
int i; |
|
Lines 3203-3208
channel_clear_permitted_opens(void)
Link Here
|
| 3203 |
} |
3249 |
} |
| 3204 |
|
3250 |
|
| 3205 |
void |
3251 |
void |
|
|
3252 |
channel_clear_permitted_remote_opens(void) |
| 3253 |
{ |
| 3254 |
|
| 3255 |
free(permitted_remote_opens); |
| 3256 |
permitted_remote_opens = NULL; |
| 3257 |
num_permitted_remote_opens = 0; |
| 3258 |
} |
| 3259 |
|
| 3260 |
|
| 3261 |
void |
| 3206 |
channel_clear_adm_permitted_opens(void) |
3262 |
channel_clear_adm_permitted_opens(void) |
| 3207 |
{ |
3263 |
{ |
| 3208 |
int i; |
3264 |
int i; |
|
Lines 3215-3220
channel_clear_adm_permitted_opens(void)
Link Here
|
| 3215 |
} |
3271 |
} |
| 3216 |
|
3272 |
|
| 3217 |
void |
3273 |
void |
|
|
3274 |
channel_clear_adm_permitted_remote_opens(void) |
| 3275 |
{ |
| 3276 |
free(permitted_adm_remote_opens); |
| 3277 |
permitted_adm_remote_opens = NULL; |
| 3278 |
num_adm_permitted_remote_opens = 0; |
| 3279 |
} |
| 3280 |
|
| 3281 |
|
| 3282 |
void |
| 3218 |
channel_print_adm_permitted_opens(void) |
3283 |
channel_print_adm_permitted_opens(void) |
| 3219 |
{ |
3284 |
{ |
| 3220 |
int i; |
3285 |
int i; |
|
Lines 3399-3404
channel_connect_to(const char *host, u_short port, char *ctype, char *rname)
Link Here
|
| 3399 |
return connect_to(host, port, ctype, rname); |
3464 |
return connect_to(host, port, ctype, rname); |
| 3400 |
} |
3465 |
} |
| 3401 |
|
3466 |
|
|
|
3467 |
/* Check if remote port is permitted and connect. */ |
| 3468 |
int |
| 3469 |
channel_connect_remote_to(u_short port) |
| 3470 |
{ |
| 3471 |
int i, permit, permit_adm = 1; |
| 3472 |
int allowed_port = 0; |
| 3473 |
|
| 3474 |
permit = all_remote_opens_permitted; |
| 3475 |
if (!permit) { |
| 3476 |
for (i = 0; i < num_permitted_remote_opens; i++) { |
| 3477 |
allowed_port = permitted_remote_opens[i].listen_port; |
| 3478 |
debug("i=%d check remote permitted vs requested " |
| 3479 |
"%u vs %u", i, allowed_port, port); |
| 3480 |
if ( port_match(allowed_port, port)) { |
| 3481 |
debug2("i=%d found match remote permitted vs " |
| 3482 |
"requested %u==%u", i, allowed_port, port); |
| 3483 |
permit = 1; |
| 3484 |
break; |
| 3485 |
} |
| 3486 |
} |
| 3487 |
} |
| 3488 |
if (num_adm_permitted_remote_opens > 0) { |
| 3489 |
permit_adm = 0; |
| 3490 |
for (i = 0; i < num_adm_permitted_remote_opens; i++) |
| 3491 |
if (port_match(allowed_port, port) ) { |
| 3492 |
/* && strcmp(permitted_adm_remote_opens[i].host_to_connect, host) == 0) */ |
| 3493 |
debug2("i=%d found match admin remote permitted vs " |
| 3494 |
"requested %u==%u", i, allowed_port, port); |
| 3495 |
permit_adm = 1; |
| 3496 |
|
| 3497 |
} |
| 3498 |
} |
| 3499 |
|
| 3500 |
if (!permit || !permit_adm) { |
| 3501 |
logit("Received request to forward remote port %d, " |
| 3502 |
"but the request was denied. return %d", port, permit); |
| 3503 |
return 0; |
| 3504 |
} |
| 3505 |
return ( permit | permit_adm); |
| 3506 |
} |
| 3507 |
|
| 3508 |
|
| 3509 |
|
| 3402 |
void |
3510 |
void |
| 3403 |
channel_send_window_changes(void) |
3511 |
channel_send_window_changes(void) |
| 3404 |
{ |
3512 |
{ |