Skip to content

Commit dac71fc

Browse files
authored
feat: add CLI flag to disable re-authentication (#491)
1 parent d51e575 commit dac71fc

File tree

15 files changed

+141
-113
lines changed

15 files changed

+141
-113
lines changed

cmd/daemon/full_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,10 +189,10 @@ func TestFull(t *testing.T) {
189189
">CLIENT:ENV,END",
190190
}, "\r\n")
191191

192-
testutils.SendMessage(t, managementInterfaceConn, msg+"\r\n")
192+
testutils.SendMessagef(t, managementInterfaceConn, msg+"\r\n")
193193

194194
authURL := testutils.ReadLine(t, managementInterfaceConn, reader)
195-
testutils.SendMessage(t, managementInterfaceConn, "SUCCESS: client-pending-auth command succeeded")
195+
testutils.SendMessagef(t, managementInterfaceConn, "SUCCESS: client-pending-auth command succeeded")
196196

197197
_, authURL, _ = strings.Cut(authURL, `"`)
198198
authURL, _, _ = strings.Cut(authURL, `"`)
@@ -207,7 +207,7 @@ func TestFull(t *testing.T) {
207207
defer wg.Done()
208208

209209
testutils.ReadLine(t, managementInterfaceConn, reader)
210-
testutils.SendMessage(t, managementInterfaceConn, "SUCCESS: client-auth command succeeded")
210+
testutils.SendMessagef(t, managementInterfaceConn, "SUCCESS: client-auth command succeeded")
211211
}()
212212

213213
resp, err := httpClient.Do(request)

docs/Configuration.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ openvpn:
9393
# password: ""
9494
# socket-group: ""
9595
# socket-mode: 660
96+
reauthentication: true
9697
```
9798
</details>
9899
@@ -220,6 +221,8 @@ Usage of openvpn-auth-oauth2:
220221
The unix file permission mode for the pass-through socket. Used only, if openvpn.pass-through.address starts with unix:// (env: CONFIG_OPENVPN_PASS__THROUGH_SOCKET__MODE) (default 660)
221222
--openvpn.password value
222223
openvpn management interface password. If argument starts with file:// it reads the secret from a file. (env: CONFIG_OPENVPN_PASSWORD)
224+
--openvpn.reauthentication
225+
If set to false, openvpn-auth-oauth2 rejects all re-authentication requests. (env: CONFIG_OPENVPN_REAUTHENTICATION) (default true)
223226
--version
224227
show version
225228
```

internal/config/config_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ openvpn:
123123
password: "password"
124124
socket-group: "group"
125125
socket-mode: 0666
126+
reauthentication: false
126127
http:
127128
listen: ":9001"
128129
secret: "1jd93h5b6s82lf03jh5b2hf9"
@@ -204,7 +205,8 @@ http:
204205
SocketMode: 0o666,
205206
Password: "password",
206207
},
207-
CommandTimeout: 10 * time.Second,
208+
CommandTimeout: 10 * time.Second,
209+
ReAuthentication: false,
208210
},
209211
OAuth2: config.OAuth2{
210212
Issuer: types.URL{URL: &url.URL{

internal/config/flags.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -141,21 +141,21 @@ func (c *Config) flagSetOpenVPN(flagSet *flag.FlagSet) {
141141
"bypass oauth authentication for CNs. Comma separated list.",
142142
)
143143
flagSet.BoolVar(
144-
&c.OpenVpn.ClientConfig.Enabled,
144+
&c.OpenVPN.ClientConfig.Enabled,
145145
"openvpn.client-config.enabled",
146-
lookupEnvOrDefault("openvpn.client-config.enabled", c.OpenVpn.ClientConfig.Enabled),
146+
lookupEnvOrDefault("openvpn.client-config.enabled", c.OpenVPN.ClientConfig.Enabled),
147147
"If true, openvpn-auth-oauth2 will read the CCD directory for additional configuration. This function mimic the client-config-dir directive in OpenVPN.",
148148
)
149149
flagSet.TextVar(
150-
&c.OpenVpn.ClientConfig.Path,
150+
&c.OpenVPN.ClientConfig.Path,
151151
"openvpn.client-config.path",
152-
lookupEnvOrDefault("openvpn.client-config.path", c.OpenVpn.ClientConfig.Path),
152+
lookupEnvOrDefault("openvpn.client-config.path", c.OpenVPN.ClientConfig.Path),
153153
"Path to the CCD directory. openvpn-auth-oauth2 will look for an file with an .conf suffix and returns the content back.",
154154
)
155155
flagSet.StringVar(
156-
&c.OpenVpn.ClientConfig.TokenClaim,
156+
&c.OpenVPN.ClientConfig.TokenClaim,
157157
"openvpn.client-config.token-claim",
158-
lookupEnvOrDefault("openvpn.client-config.token-claim", c.OpenVpn.ClientConfig.TokenClaim),
158+
lookupEnvOrDefault("openvpn.client-config.token-claim", c.OpenVPN.ClientConfig.TokenClaim),
159159
"If non-empty, the value of the token claim is used to lookup the configuration file in the CCD directory. If empty, the common name is used.",
160160
)
161161
flagSet.StringVar(

internal/config/types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ type OpenVPN struct {
5252
Addr types.URL `json:"addr" yaml:"addr"`
5353
AuthTokenUser bool `json:"auth-token-user" yaml:"auth-token-user"`
5454
AuthPendingTimeout time.Duration `json:"auth-pending-timeout" yaml:"auth-pending-timeout"`
55-
Bypass OpenVpnBypass `json:"bypass" yaml:"bypass"`
55+
Bypass OpenVPNBypass `json:"bypass" yaml:"bypass"`
5656
ClientConfig OpenVPNConfig `json:"client-config" yaml:"client-config"`
5757
CommonName OpenVPNCommonName `json:"common-name" yaml:"common-name"`
5858
CommandTimeout time.Duration `json:"command-timeout" yaml:"command-timeout"`

internal/config/validate.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,12 +107,12 @@ func validateOAuth2Config(conf Config) error {
107107
}
108108
}
109109

110-
if conf.OpenVpn.ClientConfig.Enabled {
111-
if conf.OpenVpn.CommonName.Mode == CommonNameModeOmit {
110+
if conf.OpenVPN.ClientConfig.Enabled {
111+
if conf.OpenVPN.CommonName.Mode == CommonNameModeOmit {
112112
return errors.New("openvpn.common-name.mode: omit is not supported with openvpn.ccd.enabled")
113113
}
114114

115-
file, err := conf.OpenVpn.ClientConfig.Path.Open(".")
115+
file, err := conf.OpenVPN.ClientConfig.Path.Open(".")
116116
if err != nil {
117117
return fmt.Errorf("openvpn.ccd.path: %w", err)
118118
}

internal/internal_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ func BenchmarkFull(b *testing.B) {
5959
wgc := sync.WaitGroup{}
6060

6161
for b.Loop() {
62-
testutils.SendMessage(b, managementInterfaceConn, ">CLIENT:CONNECT,0,1\r\n>CLIENT:ENV,n_clients=0\r\n>CLIENT:ENV,password=\r\n>CLIENT:ENV,untrusted_port=17016\r\n>CLIENT:ENV,untrusted_ip=192.168.65.1\r\n>CLIENT:ENV,[email protected]\r\n>CLIENT:ENV,username=\r\n>CLIENT:ENV,IV_BS64DL=1\r\n>CLIENT:ENV,IV_SSO=webauth,openurl,crtext\r\n>CLIENT:ENV,IV_GUI_VER=OCmacOS_3.4.4-4629\r\n>CLIENT:ENV,IV_AUTO_SESS=1\r\n>CLIENT:ENV,IV_CIPHERS=AES-128-GCM:AES-192-GCM:AES-256-GCM:CHACHA20-POLY1305\r\n>CLIENT:ENV,IV_MTU=1600\r\n>CLIENT:ENV,IV_PROTO=990\r\n>CLIENT:ENV,IV_TCPNL=1\r\n>CLIENT:ENV,IV_NCP=2\r\n>CLIENT:ENV,IV_PLAT=mac\r\n>CLIENT:ENV,IV_VER=3.8.1\r\n>CLIENT:ENV,tls_serial_hex_0=51:b3:55:90:65:af:71:5c:d5:52:2b:0b:00:14:8d:ee\r\n>CLIENT:ENV,tls_serial_0=108598624241397715647038806614705737198\r\n>CLIENT:ENV,tls_digest_sha256_0=d3:6d:1d:96:f8:bd:7e:e8:db:c4:0f:53:a1:76:f0:ca:9e:78:63:bf:c6:4a:ac:b9:e6:ed:84:62:f5:ac:5d:b8\r\n>CLIENT:ENV,tls_digest_0=b7:73:bd:6c:31:31:49:63:0d:0c:11:6d:0c:13:d0:b4:8f:97:33:7d\r\n>CLIENT:ENV,[email protected]\r\n>CLIENT:ENV,[email protected]\r\n>CLIENT:ENV,tls_serial_hex_1=01:b3:95:f8:1a:9f:9f:fe:7c:27:ad:29:c1:93:23:ae:08:7f:ab:36\r\n>CLIENT:ENV,tls_serial_1=9713888317380397892476539918183380788698917686\r\n>CLIENT:ENV,tls_digest_sha256_1=75:1a:a1:63:bb:e9:c7:f3:e3:bf:e1:08:f1:36:b7:36:90:04:da:dd:b8:78:b1:cf:d5:ac:09:b6:36:31:a7:db\r\n>CLIENT:ENV,tls_digest_1=d4:bc:00:89:e5:01:0c:27:3d:ea:4a:b5:42:8b:f7:3d:19:7a:a2:25\r\n>CLIENT:ENV,tls_id_1=CN=Easy-RSA CA\r\n>CLIENT:ENV,X509_1_CN=Easy-RSA CA\r\n>CLIENT:ENV,remote_port_1=1194\r\n>CLIENT:ENV,local_port_1=1194\r\n>CLIENT:ENV,proto_1=udp\r\n>CLIENT:ENV,daemon_pid=7\r\n>CLIENT:ENV,daemon_start_time=1703401559\r\n>CLIENT:ENV,daemon_log_redirect=0\r\n>CLIENT:ENV,daemon=0\r\n>CLIENT:ENV,verb=3\r\n>CLIENT:ENV,config=/etc/openvpn/openvpn.conf\r\n>CLIENT:ENV,ifconfig_local=100.64.0.1\r\n>CLIENT:ENV,ifconfig_netmask=255.255.255.0\r\n>CLIENT:ENV,script_context=init\r\n>CLIENT:ENV,tun_mtu=1500\r\n>CLIENT:ENV,dev=tun0\r\n>CLIENT:ENV,dev_type=tun\r\n>CLIENT:ENV,redirect_gateway=0\r\n>CLIENT:ENV,END\r\n")
62+
testutils.SendMessagef(b, managementInterfaceConn, ">CLIENT:CONNECT,0,1\r\n>CLIENT:ENV,n_clients=0\r\n>CLIENT:ENV,password=\r\n>CLIENT:ENV,untrusted_port=17016\r\n>CLIENT:ENV,untrusted_ip=192.168.65.1\r\n>CLIENT:ENV,[email protected]\r\n>CLIENT:ENV,username=\r\n>CLIENT:ENV,IV_BS64DL=1\r\n>CLIENT:ENV,IV_SSO=webauth,openurl,crtext\r\n>CLIENT:ENV,IV_GUI_VER=OCmacOS_3.4.4-4629\r\n>CLIENT:ENV,IV_AUTO_SESS=1\r\n>CLIENT:ENV,IV_CIPHERS=AES-128-GCM:AES-192-GCM:AES-256-GCM:CHACHA20-POLY1305\r\n>CLIENT:ENV,IV_MTU=1600\r\n>CLIENT:ENV,IV_PROTO=990\r\n>CLIENT:ENV,IV_TCPNL=1\r\n>CLIENT:ENV,IV_NCP=2\r\n>CLIENT:ENV,IV_PLAT=mac\r\n>CLIENT:ENV,IV_VER=3.8.1\r\n>CLIENT:ENV,tls_serial_hex_0=51:b3:55:90:65:af:71:5c:d5:52:2b:0b:00:14:8d:ee\r\n>CLIENT:ENV,tls_serial_0=108598624241397715647038806614705737198\r\n>CLIENT:ENV,tls_digest_sha256_0=d3:6d:1d:96:f8:bd:7e:e8:db:c4:0f:53:a1:76:f0:ca:9e:78:63:bf:c6:4a:ac:b9:e6:ed:84:62:f5:ac:5d:b8\r\n>CLIENT:ENV,tls_digest_0=b7:73:bd:6c:31:31:49:63:0d:0c:11:6d:0c:13:d0:b4:8f:97:33:7d\r\n>CLIENT:ENV,[email protected]\r\n>CLIENT:ENV,[email protected]\r\n>CLIENT:ENV,tls_serial_hex_1=01:b3:95:f8:1a:9f:9f:fe:7c:27:ad:29:c1:93:23:ae:08:7f:ab:36\r\n>CLIENT:ENV,tls_serial_1=9713888317380397892476539918183380788698917686\r\n>CLIENT:ENV,tls_digest_sha256_1=75:1a:a1:63:bb:e9:c7:f3:e3:bf:e1:08:f1:36:b7:36:90:04:da:dd:b8:78:b1:cf:d5:ac:09:b6:36:31:a7:db\r\n>CLIENT:ENV,tls_digest_1=d4:bc:00:89:e5:01:0c:27:3d:ea:4a:b5:42:8b:f7:3d:19:7a:a2:25\r\n>CLIENT:ENV,tls_id_1=CN=Easy-RSA CA\r\n>CLIENT:ENV,X509_1_CN=Easy-RSA CA\r\n>CLIENT:ENV,remote_port_1=1194\r\n>CLIENT:ENV,local_port_1=1194\r\n>CLIENT:ENV,proto_1=udp\r\n>CLIENT:ENV,daemon_pid=7\r\n>CLIENT:ENV,daemon_start_time=1703401559\r\n>CLIENT:ENV,daemon_log_redirect=0\r\n>CLIENT:ENV,daemon=0\r\n>CLIENT:ENV,verb=3\r\n>CLIENT:ENV,config=/etc/openvpn/openvpn.conf\r\n>CLIENT:ENV,ifconfig_local=100.64.0.1\r\n>CLIENT:ENV,ifconfig_netmask=255.255.255.0\r\n>CLIENT:ENV,script_context=init\r\n>CLIENT:ENV,tun_mtu=1500\r\n>CLIENT:ENV,dev=tun0\r\n>CLIENT:ENV,dev_type=tun\r\n>CLIENT:ENV,redirect_gateway=0\r\n>CLIENT:ENV,END\r\n")
6363

6464
authURL = testutils.ReadLine(b, managementInterfaceConn, reader)
65-
testutils.SendMessage(b, managementInterfaceConn, "SUCCESS: client-pending-auth command succeeded")
65+
testutils.SendMessagef(b, managementInterfaceConn, "SUCCESS: client-pending-auth command succeeded")
6666

6767
_, authURL, _ = strings.Cut(authURL, `"`)
6868
authURL, _, _ = strings.Cut(authURL, `"`)
@@ -76,7 +76,7 @@ func BenchmarkFull(b *testing.B) {
7676
defer wgc.Done()
7777

7878
testutils.ReadLine(b, managementInterfaceConn, reader)
79-
testutils.SendMessage(b, managementInterfaceConn, "SUCCESS: client-auth command succeeded")
79+
testutils.SendMessagef(b, managementInterfaceConn, "SUCCESS: client-auth command succeeded")
8080
}()
8181

8282
resp, _ = httpClient.Do(request)

internal/oauth2/handler_test.go

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -246,10 +246,10 @@ func TestHandler(t *testing.T) {
246246
conf.OAuth2.Validate.Roles = make([]string, 0)
247247
conf.OAuth2.Validate.Issuer = true
248248
conf.OAuth2.Validate.IPAddr = false
249-
conf.OpenVpn.Bypass.CommonNames = make([]string, 0)
250-
conf.OpenVpn.AuthTokenUser = true
251-
conf.OpenVpn.ClientConfig.Enabled = true
252-
conf.OpenVpn.ClientConfig.Path = types.FS{
249+
conf.OpenVPN.Bypass.CommonNames = make([]string, 0)
250+
conf.OpenVPN.AuthTokenUser = true
251+
conf.OpenVPN.ClientConfig.Enabled = true
252+
conf.OpenVPN.ClientConfig.Path = types.FS{
253253
FS: fstest.MapFS{
254254
"name.conf": &fstest.MapFile{
255255
Data: []byte("push \"ping 60\"\npush \"ping-restart 180\"\r\npush \"ping-timer-rem\" 0\r\n"),
@@ -279,10 +279,10 @@ func TestHandler(t *testing.T) {
279279
conf.OAuth2.Validate.Roles = make([]string, 0)
280280
conf.OAuth2.Validate.Issuer = true
281281
conf.OAuth2.Validate.IPAddr = false
282-
conf.OpenVpn.Bypass.CommonNames = make([]string, 0)
283-
conf.OpenVpn.AuthTokenUser = true
284-
conf.OpenVpn.ClientConfig.Enabled = true
285-
conf.OpenVpn.ClientConfig.Path = types.FS{
282+
conf.OpenVPN.Bypass.CommonNames = make([]string, 0)
283+
conf.OpenVPN.AuthTokenUser = true
284+
conf.OpenVPN.ClientConfig.Enabled = true
285+
conf.OpenVPN.ClientConfig.Path = types.FS{
286286
FS: fstest.MapFS{},
287287
}
288288

@@ -429,7 +429,7 @@ func TestHandler(t *testing.T) {
429429

430430
if !tc.preAllow {
431431
testutils.ExpectMessage(t, managementInterfaceConn, reader, `client-deny 0 1 "client rejected: http client ip 127.0.0.1 and vpn ip 127.0.0.2 is different"`)
432-
testutils.SendMessage(t, managementInterfaceConn, "SUCCESS: client-deny command succeeded")
432+
testutils.SendMessagef(t, managementInterfaceConn, "SUCCESS: client-deny command succeeded")
433433
}
434434

435435
select {
@@ -479,26 +479,26 @@ func TestHandler(t *testing.T) {
479479
switch {
480480
case !tc.postAllow:
481481
testutils.ExpectMessage(t, managementInterfaceConn, reader, `client-deny 0 1 "client rejected"`)
482-
testutils.SendMessage(t, managementInterfaceConn, "SUCCESS: client-deny command succeeded")
482+
testutils.SendMessagef(t, managementInterfaceConn, "SUCCESS: client-deny command succeeded")
483483
case tc.state.Client.UsernameIsDefined == 1:
484484
testutils.ExpectMessage(t, managementInterfaceConn, reader, "client-auth-nt 0 1")
485-
testutils.SendMessage(t, managementInterfaceConn, "SUCCESS: client-auth command succeeded")
486-
case tc.conf.OpenVpn.ClientConfig.Enabled:
485+
testutils.SendMessagef(t, managementInterfaceConn, "SUCCESS: client-auth command succeeded")
486+
case tc.conf.OpenVPN.ClientConfig.Enabled:
487487
if tc.state.Client.CommonName == "name" {
488488
testutils.ExpectMessage(t, managementInterfaceConn, reader, "client-auth 0 1\r\n"+
489489
"push \"ping 60\"\r\n"+
490490
"push \"ping-restart 180\"\r\n"+
491491
"push \"ping-timer-rem\" 0\r\n"+
492492
"push \"auth-token-user bmFtZQ==\"\r\n"+
493493
"END")
494-
testutils.SendMessage(t, managementInterfaceConn, "SUCCESS: client-auth command succeeded")
494+
testutils.SendMessagef(t, managementInterfaceConn, "SUCCESS: client-auth command succeeded")
495495
} else {
496496
testutils.ExpectMessage(t, managementInterfaceConn, reader, "client-auth 0 1\r\npush \"auth-token-user Y2xpZW50\"\r\nEND")
497-
testutils.SendMessage(t, managementInterfaceConn, "SUCCESS: client-auth command succeeded")
497+
testutils.SendMessagef(t, managementInterfaceConn, "SUCCESS: client-auth command succeeded")
498498
}
499499
default:
500500
testutils.ExpectMessage(t, managementInterfaceConn, reader, "client-auth 0 1\r\npush \"auth-token-user bmFtZQ==\"\r\nEND")
501-
testutils.SendMessage(t, managementInterfaceConn, "SUCCESS: client-auth command succeeded")
501+
testutils.SendMessagef(t, managementInterfaceConn, "SUCCESS: client-auth command succeeded")
502502
}
503503

504504
select {

0 commit comments

Comments
 (0)