Enable Feishu session username override with OpenVPN 2.7

This commit is contained in:
Codex committed 2026-10-23 00:05:59 +08:00
1 parent 8fd8c0cd73
commit db3092344f
3 files changed
+115 -5

No files matched your search

+26 -3
View File
@@ -60,13 +60,35 @@ func yamlString(s string) string {
return string(b)
}
func oidcConfig(t *model.Tunnel, cfg map[string]interface{}) string {
func supportsOverrideUsername() bool {
bin, ok := findOpenVPNBin()
if !ok {
return false
}
out, err := exec.Command(bin, "--version").Output()
if err != nil {
return false
}
m := regexp.MustCompile(`OpenVPN\s+(\d+)\.(\d+)\.(\d+)`).FindSubmatch(out)
if len(m) != 4 {
return false
}
major, _ := strconv.Atoi(string(m[1]))
minor, _ := strconv.Atoi(string(m[2]))
return major > 2 || major == 2 && minor >= 7
}
func oidcConfig(t *model.Tunnel, cfg map[string]interface{}, overrideUsername bool) string {
dir := service.InstanceDir(t)
usernameConfig := ""
overrideConfig := ""
if service.Str(cfg, "oidc_provider") == "builtin" {
usernameConfig = " openvpn-username: \"string(token.claims.sub)\"\n"
if overrideUsername {
overrideConfig = " override-username: true\n"
}
}
return fmt.Sprintf("http:\n baseurl: %s\n listen: %s\n secret: %s\n template: %s\noauth2:\n%s issuer: %s\n client:\n id: %s\n secret: %s\nopenvpn:\n addr: %s\n password: %s\n auth-token-user: true\n",
return fmt.Sprintf("http:\n baseurl: %s\n listen: %s\n secret: %s\n template: %s\noauth2:\n%s issuer: %s\n client:\n id: %s\n secret: %s\nopenvpn:\n%s addr: %s\n password: %s\n auth-token-user: true\n",
yamlString(service.Str(cfg, "oidc_base_url")),
yamlString(fmt.Sprintf("127.0.0.1:%d", int(service.Num(cfg, "oidc_http_port", 19090)))),
yamlString(service.Str(cfg, "oidc_http_secret")),
@@ -75,6 +97,7 @@ func oidcConfig(t *model.Tunnel, cfg map[string]interface{}) string {
yamlString(service.Str(cfg, "oidc_issuer")),
yamlString(service.Str(cfg, "oidc_client_id")),
yamlString(service.Str(cfg, "oidc_client_secret")),
overrideConfig,
yamlString("unix://"+filepath.Join(dir, "management.sock")),
yamlString(service.Str(cfg, "oidc_management_password")))
}
@@ -153,7 +176,7 @@ func prepareOIDC(t *model.Tunnel, cfg map[string]interface{}) error {
if err := os.Chmod(pagePath, 0o600); err != nil {
return err
}
configPath, err := service.WriteConfig(t, "openvpn-auth-oauth2.yaml", oidcConfig(t, cfg))
configPath, err := service.WriteConfig(t, "openvpn-auth-oauth2.yaml", oidcConfig(t, cfg, supportsOverrideUsername()))
if err != nil {
return err
}