Re: [Openvpn-devel] [PATCH v2 2/9] Implement auth-token-user

2021-06-13 Thread Antonio Quartulli
Hi,

On 11/06/2021 11:48, Arne Schwabe wrote:
> Am 11.06.21 um 02:41 schrieb Antonio Quartulli:
>> Hi,
>>
>> On 20/05/2021 17:11, Arne Schwabe wrote:
>>> When not using username and password (i.e. auth-user-pass) it can still make
>>> to provide the client with an auth-token, e.g. for allowing a session to
>>> continue after a reconnect without requiring 2FA again.
>>>
>>> However, without --auth-user-pass openvpn does not have a username and will
>>> ignore any pushed auth-token command.
>>>
>>> This patch adds support for auth-token-user to set the username that should
>>> be used for auth-token
>>>
>>> The spec of using auth-token-user base64-encoded-user are the ones that
>>> OpenVPN3 already implements.
>>>
>>> Patch V2: Improve style, fix comments and commit message
>>>
>>> Signed-off-by: Arne Schwabe 
>>
>> This patch hasn't changed since the last time it was on the mailing list
>> (and I acked it), so the same goes for this copy.
>>
>> @Arne I have a new question though: what is expected to happen is the
>> --auth-token-user is specified in the global config?
>>
>> Is the same user supposed to be used with every client?
>> Or is it just ignored?
>>
>> I am testing this case and I don't see the user being pushed to the client.
>>
> 
> It is probably the same as with auth-token itself. OpenVPN will pick it
> up and use it but most times it is not every useful as auth-token should
> be pushed from the server. It is an artefact from how we parse things.
> 

Makes sense - it is jus interpreted locally, but there is not much sense.

This said, the rest looks good.

Acked-by: Antonio Quartulli 



-- 
Antonio Quartulli


___
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel


Re: [Openvpn-devel] [PATCH v2 2/9] Implement auth-token-user

2021-06-11 Thread Arne Schwabe
Am 11.06.21 um 02:41 schrieb Antonio Quartulli:
> Hi,
> 
> On 20/05/2021 17:11, Arne Schwabe wrote:
>> When not using username and password (i.e. auth-user-pass) it can still make
>> to provide the client with an auth-token, e.g. for allowing a session to
>> continue after a reconnect without requiring 2FA again.
>>
>> However, without --auth-user-pass openvpn does not have a username and will
>> ignore any pushed auth-token command.
>>
>> This patch adds support for auth-token-user to set the username that should
>> be used for auth-token
>>
>> The spec of using auth-token-user base64-encoded-user are the ones that
>> OpenVPN3 already implements.
>>
>> Patch V2: Improve style, fix comments and commit message
>>
>> Signed-off-by: Arne Schwabe 
> 
> This patch hasn't changed since the last time it was on the mailing list
> (and I acked it), so the same goes for this copy.
> 
> @Arne I have a new question though: what is expected to happen is the
> --auth-token-user is specified in the global config?
> 
> Is the same user supposed to be used with every client?
> Or is it just ignored?
> 
> I am testing this case and I don't see the user being pushed to the client.
>

It is probably the same as with auth-token itself. OpenVPN will pick it
up and use it but most times it is not every useful as auth-token should
be pushed from the server. It is an artefact from how we parse things.

Arne


___
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel


Re: [Openvpn-devel] [PATCH v2 2/9] Implement auth-token-user

2021-06-10 Thread Antonio Quartulli
Hi,

On 20/05/2021 17:11, Arne Schwabe wrote:
> When not using username and password (i.e. auth-user-pass) it can still make
> to provide the client with an auth-token, e.g. for allowing a session to
> continue after a reconnect without requiring 2FA again.
> 
> However, without --auth-user-pass openvpn does not have a username and will
> ignore any pushed auth-token command.
> 
> This patch adds support for auth-token-user to set the username that should
> be used for auth-token
> 
> The spec of using auth-token-user base64-encoded-user are the ones that
> OpenVPN3 already implements.
> 
> Patch V2: Improve style, fix comments and commit message
> 
> Signed-off-by: Arne Schwabe 

This patch hasn't changed since the last time it was on the mailing list
(and I acked it), so the same goes for this copy.

@Arne I have a new question though: what is expected to happen is the
--auth-token-user is specified in the global config?

Is the same user supposed to be used with every client?
Or is it just ignored?

I am testing this case and I don't see the user being pushed to the client.

Cheers,



-- 
Antonio Quartulli


___
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel


[Openvpn-devel] [PATCH v2 2/9] Implement auth-token-user

2021-05-20 Thread Arne Schwabe
When not using username and password (i.e. auth-user-pass) it can still make
to provide the client with an auth-token, e.g. for allowing a session to
continue after a reconnect without requiring 2FA again.

However, without --auth-user-pass openvpn does not have a username and will
ignore any pushed auth-token command.

This patch adds support for auth-token-user to set the username that should
be used for auth-token

The spec of using auth-token-user base64-encoded-user are the ones that
OpenVPN3 already implements.

Patch V2: Improve style, fix comments and commit message

Signed-off-by: Arne Schwabe 
---
 doc/man-sections/client-options.rst |  8 +++
 src/openvpn/misc.c  | 37 +
 src/openvpn/misc.h  | 21 +---
 src/openvpn/options.c   |  5 
 src/openvpn/ssl.c   | 12 +++---
 src/openvpn/ssl.h   |  2 ++
 6 files changed, 74 insertions(+), 11 deletions(-)

diff --git a/doc/man-sections/client-options.rst 
b/doc/man-sections/client-options.rst
index af21fbcd7..c5b7ad960 100644
--- a/doc/man-sections/client-options.rst
+++ b/doc/man-sections/client-options.rst
@@ -50,6 +50,14 @@ configuration.
   after a failed auth. Older clients will keep using the token value and
   react according to ``--auth-retry``
 
+--auth-token-user base64username
+  Companion option to ``--auth-token``. This options allows to override
+  the username used by the client when reauthenticating with the 
``auth-token``.
+  It also allows to use ``--auth-token`` in setups that normally do not use
+  username and password.
+
+  The username has to be base64 encoded.
+
 --auth-user-pass
   Authenticate with server using username/password.
 
diff --git a/src/openvpn/misc.c b/src/openvpn/misc.c
index 650daa0c6..29061cd6f 100644
--- a/src/openvpn/misc.c
+++ b/src/openvpn/misc.c
@@ -490,22 +490,49 @@ void
 set_auth_token(struct user_pass *up, struct user_pass *tk, const char *token)
 {
 
-if (strlen(token) && (up->defined || tk->defined))
+if (strlen(token))
 {
-/* auth-token has no password, so it needs the username
- * either already set or copied from up */
 strncpynt(tk->password, token, USER_PASS_LEN);
-if (up->defined)
+tk->token_defined = true;
+
+/*
+ * --auth-token has no username, so it needs the username
+ * either already set or copied from up, or later set by
+ * --auth-token-user
+ *
+ * Do not overwrite the username if already set to avoid
+ * overwriting an auth-token
+ */
+if (up->defined && !tk->defined)
 {
 strncpynt(tk->username, up->username, USER_PASS_LEN);
+tk->defined = true;
 }
-tk->defined = true;
 }
 
 /* Cleans user/pass for nocache */
 purge_user_pass(up, false);
 }
 
+void
+set_auth_token_user(struct user_pass *tk, const char *username)
+{
+if (strlen(username))
+{
+/* Clear the username before decoding to ensure no old material is left
+ * and also allow decoding to not use all space to ensure the last 
byte is
+ * always 0 */
+CLEAR(tk->username);
+int len = openvpn_base64_decode(username, tk->username, USER_PASS_LEN 
- 1);
+tk->defined = len > 0;
+if (!tk->defined)
+{
+msg(D_PUSH, "Error decoding auth-token-username");
+}
+}
+}
+
+
 /*
  * Process string received by untrusted peer before
  * printing to console or log file.
diff --git a/src/openvpn/misc.h b/src/openvpn/misc.h
index d9005353e..0d2d42489 100644
--- a/src/openvpn/misc.h
+++ b/src/openvpn/misc.h
@@ -56,6 +56,9 @@ const char *hostname_randomize(const char *hostname, struct 
gc_arena *gc);
 struct user_pass
 {
 bool defined;
+/* For auth-token username and token can be set individually, so
+ * we this second bool to track if the token (password) is defined */
+bool token_defined;
 bool nocache;
 
 /* max length of username/password */
@@ -138,19 +141,31 @@ void fail_user_pass(const char *prefix,
 void purge_user_pass(struct user_pass *up, const bool force);
 
 /**
- * Sets the auth-token to token if a username is available from either
- * up or already present in tk. The method will also purge up if
+ * Sets the auth-token to token. Ff a username is available from either
+ * up or already present in tk is the auth-token that will be used as default
+ * username for the token. The method will also purge up if
  * the auth-nocache option is active.
  *
  * @param up(non Auth-token) Username/password
  * @param tkauth-token userpass to set
- * @param token token to use as password for the
+ * @param token token to use as password for the auth-token
  *
  * @noteall parameters to this function must not be null.
  */
 void set_auth_token(struct user_pass *up, struct user_pass *tk,
 const