Skip to content

Commit

Permalink
Http-proxy: fix bug preventing proxy credentials caching
Browse files Browse the repository at this point in the history
Caching proxy credentials was not working due to the
lack of handling already defined creds in get_user_pass(),
which prevented the caching from working properly.

Fix this issue by getting the value of c->first_time,
that indicates if we're at the first iteration
of the main loop and use it as second argument of the
get_user_pass_http(). Otherwise, on SIGUSR1 or SIGHUP
upon instance context restart credentials would be erased
every time.

The nocache member has been added to the struct
http_proxy_options and also a getter method to retrieve
that option from ssl has been added, by doing this
we're able to erase previous queried user credentials
to ensure correct operation.

Fixes: Trac #1187
Signed-off-by: Gianmarco De Gregori <[email protected]>
Acked-by: Gert Doering <[email protected]>
Change-Id: Ia3e06c0832c4ca0ab868c845279fb71c01a1a78a
Acked-by: Frank Lichtenheld <[email protected]>
Message-Id: <[email protected]>
URL: https://www.mail-archive.com/[email protected]/msg28835.html
Signed-off-by: Gert Doering <[email protected]>
  • Loading branch information
itsGiaan authored and cron2 committed Jun 25, 2024
1 parent 5635592 commit 3cfd6f9
Show file tree
Hide file tree
Showing 7 changed files with 38 additions and 14 deletions.
3 changes: 0 additions & 3 deletions doc/man-sections/generic-options.rst
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,6 @@ which mode OpenVPN is configured as.
When using ``--auth-nocache`` in combination with a user/password file
and ``--chroot`` or ``--daemon``, make sure to use an absolute path.

This directive does not affect the ``--http-proxy`` username/password.
It is always cached.

--cd dir
Change directory to ``dir`` prior to reading any files such as
configuration files, key files, scripts, etc. ``dir`` should be an
Expand Down
2 changes: 2 additions & 0 deletions src/openvpn/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -691,6 +691,8 @@ init_proxy_dowork(struct context *c)

if (c->options.ce.http_proxy_options)
{
c->options.ce.http_proxy_options->first_time = c->first_time;

/* Possible HTTP proxy user/pass input */
c->c1.http_proxy = http_proxy_new(c->options.ce.http_proxy_options);
if (c->c1.http_proxy)
Expand Down
6 changes: 6 additions & 0 deletions src/openvpn/options.c
Original file line number Diff line number Diff line change
Expand Up @@ -1650,6 +1650,7 @@ show_http_proxy_options(const struct http_proxy_options *o)
SHOW_STR(auth_file);
SHOW_STR(auth_file_up);
SHOW_BOOL(inline_creds);
SHOW_BOOL(nocache);
SHOW_STR(http_version);
SHOW_STR(user_agent);
for (i = 0; i < MAX_CUSTOM_HTTP_HEADER && o->custom_headers[i].name; i++)
Expand Down Expand Up @@ -3151,6 +3152,11 @@ options_postprocess_mutate_ce(struct options *o, struct connection_entry *ce)
ce->flags |= CE_DISABLED;
}

if (ce->http_proxy_options)
{
ce->http_proxy_options->nocache = ssl_get_auth_nocache();
}

/* our socks code is not fully IPv6 enabled yet (TCP works, UDP not)
* so fall back to IPv4-only (trac #1221)
*/
Expand Down
25 changes: 14 additions & 11 deletions src/openvpn/proxy.c
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ get_user_pass_http(struct http_proxy_info *p, const bool force)
{
auth_file = p->options.auth_file_up;
}
if (p->queried_creds)
if (p->queried_creds && !static_proxy_user_pass.nocache)
{
flags |= GET_USER_PASS_PREVIOUS_CREDS_FAILED;
}
Expand All @@ -288,9 +288,14 @@ get_user_pass_http(struct http_proxy_info *p, const bool force)
auth_file,
UP_TYPE_PROXY,
flags);
p->queried_creds = true;
p->up = static_proxy_user_pass;
static_proxy_user_pass.nocache = p->options.nocache;
}

/*
* Using cached credentials
*/
p->queried_creds = true;
p->up = static_proxy_user_pass;
}

#if 0
Expand Down Expand Up @@ -542,7 +547,7 @@ http_proxy_new(const struct http_proxy_options *o)
* we know whether we need any. */
if (p->auth_method == HTTP_AUTH_BASIC || p->auth_method == HTTP_AUTH_NTLM2)
{
get_user_pass_http(p, true);
get_user_pass_http(p, p->options.first_time);
}

#if !NTLM
Expand Down Expand Up @@ -656,6 +661,11 @@ establish_http_proxy_passthru(struct http_proxy_info *p,
|| p->auth_method == HTTP_AUTH_NTLM2)
{
get_user_pass_http(p, false);

if (p->up.nocache)
{
clear_user_pass_http();
}
}

/* are we being called again after getting the digest server nonce in the previous transaction? */
Expand Down Expand Up @@ -1036,13 +1046,6 @@ establish_http_proxy_passthru(struct http_proxy_info *p,
}
goto error;
}

/* clear state */
if (p->options.auth_retry)
{
clear_user_pass_http();
}
store_proxy_authenticate(p, NULL);
}

/* check return code, success = 200 */
Expand Down
2 changes: 2 additions & 0 deletions src/openvpn/proxy.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ struct http_proxy_options {
const char *user_agent;
struct http_custom_header custom_headers[MAX_CUSTOM_HTTP_HEADER];
bool inline_creds; /* auth_file_up is inline credentials */
bool first_time; /* indicates if we need to wipe user creds at the first iteration of the main loop */
bool nocache;
};

struct http_proxy_options_simple {
Expand Down
9 changes: 9 additions & 0 deletions src/openvpn/ssl.c
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,15 @@ ssl_set_auth_nocache(void)
auth_user_pass.nocache = true;
}

/*
* Get the password caching
*/
bool
ssl_get_auth_nocache(void)
{
return passbuf.nocache;
}

/*
* Set an authentication token
*/
Expand Down
5 changes: 5 additions & 0 deletions src/openvpn/ssl.h
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,11 @@ void auth_user_pass_setup(const char *auth_file, bool is_inline,
*/
void ssl_set_auth_nocache(void);

/*
* Getter method for retrieving the auth-nocache option.
*/
bool ssl_get_auth_nocache(void);

/*
* Purge any stored authentication information, both for key files and tunnel
* authentication. If PCKS #11 is enabled, purge authentication for that too.
Expand Down

0 comments on commit 3cfd6f9

Please sign in to comment.