1- use std:: { cell:: RefCell , fs, sync:: Arc } ;
1+ use std:: { borrow :: Cow , cell:: RefCell , fs, sync:: Arc } ;
22
33use anyhow:: bail;
44use clap:: Args ;
5- use common:: constants:: GP_USER_AGENT ;
5+ use common:: constants:: { GP_CLIENT_VERSION , GP_USER_AGENT } ;
66use gpapi:: {
77 auth:: SamlAuthResult ,
88 clap:: { ToVerboseArg , args:: Os } ,
@@ -15,7 +15,7 @@ use gpapi::{
1515 auth_launcher:: SamlAuthLauncher ,
1616 users:: { get_non_root_user, get_user_by_name} ,
1717 } ,
18- utils:: { request:: RequestIdentityError , shutdown_signal} ,
18+ utils:: { host_utils , request:: RequestIdentityError , shutdown_signal} ,
1919} ;
2020use inquire:: { Password , PasswordDisplayMode , Select , Text } ;
2121use log:: { info, warn} ;
@@ -86,8 +86,11 @@ pub(crate) struct ConnectArgs {
8686 #[ arg( long, help = "Do not ask for IPv6 connectivity" ) ]
8787 disable_ipv6 : bool ,
8888
89- #[ arg( long, default_value = GP_USER_AGENT , help = "The user agent to use" ) ]
90- user_agent : String ,
89+ #[ arg(
90+ long,
91+ help = "The user agent to use, if not specified, it will be generated based on the OS and client version"
92+ ) ]
93+ user_agent : Option < String > ,
9194
9295 #[ arg( long, value_enum, default_value_t = ConnectArgs :: default_os( ) ) ]
9396 os : Os ,
@@ -130,18 +133,29 @@ pub(crate) struct ConnectArgs {
130133
131134impl ConnectArgs {
132135 fn default_os ( ) -> Os {
133- if cfg ! ( target_os = "macos" ) { Os :: Mac } else { Os :: Linux }
136+ #[ cfg( target_os = "macos" ) ]
137+ {
138+ Os :: Mac
139+ }
140+ #[ cfg( target_os = "windows" ) ]
141+ {
142+ Os :: Windows
143+ }
144+ #[ cfg( not( any( target_os = "macos" , target_os = "windows" ) ) ) ]
145+ {
146+ Os :: Linux
147+ }
134148 }
135149
136- fn os_version ( & self ) -> String {
150+ fn os_version ( & self ) -> & str {
137151 if let Some ( os_version) = self . os_version . as_deref ( ) {
138- return os_version. to_string ( ) ;
152+ return os_version;
139153 }
140154
141155 match self . os {
142- Os :: Linux => format ! ( "Linux {}" , whoami :: distro ( ) ) ,
143- Os :: Windows => String :: from ( "Microsoft Windows 11 Pro , 64-bit" ) ,
144- Os :: Mac => String :: from ( "Apple Mac OS X 13.4.0" ) ,
156+ Os :: Linux => host_utils :: get_linux_os_string ( ) ,
157+ Os :: Windows => host_utils :: get_windows_os_string ( ) ,
158+ Os :: Mac => host_utils :: get_macos_os_string ( ) ,
145159 }
146160 }
147161}
@@ -163,11 +177,25 @@ impl<'a> ConnectHandler<'a> {
163177 }
164178 }
165179
180+ fn user_agent ( & self ) -> Cow < ' _ , str > {
181+ if let Some ( user_agent) = self . args . user_agent . as_deref ( ) {
182+ Cow :: Borrowed ( user_agent)
183+ } else {
184+ let client_version = self . args . client_version . as_deref ( ) . unwrap_or ( GP_CLIENT_VERSION ) ;
185+ Cow :: Owned ( format ! (
186+ "{}/{} ({})" ,
187+ GP_USER_AGENT ,
188+ client_version,
189+ self . args. os_version( )
190+ ) )
191+ }
192+ }
193+
166194 fn build_gp_params ( & self ) -> GpParams {
167195 GpParams :: builder ( )
168- . user_agent ( & self . args . user_agent )
196+ . user_agent ( & self . user_agent ( ) )
169197 . client_os ( ClientOs :: from ( & self . args . os ) )
170- . os_version ( self . args . os_version ( ) )
198+ . os_version ( self . args . os_version ( ) . to_owned ( ) )
171199 . ignore_tls_errors ( self . shared_args . ignore_tls_errors )
172200 . certificate ( self . args . certificate . clone ( ) )
173201 . sslkey ( self . args . sslkey . clone ( ) )
@@ -331,14 +359,16 @@ impl<'a> ConnectHandler<'a> {
331359 ( false , None )
332360 } ;
333361
334- let os = ClientOs :: from ( & self . args . os ) . to_openconnect_os ( ) . to_string ( ) ;
362+ let os = ClientOs :: from ( & self . args . os ) . to_openconnect_os ( ) . to_owned ( ) ;
363+ let os_version = self . args . os_version ( ) . to_owned ( ) ;
335364 let client_version = client_version. map ( |s| s. to_owned ( ) ) ;
336365 let vpn = Vpn :: builder ( gateway, cookie)
337366 . script ( self . args . script . clone ( ) )
338367 . interface ( self . args . interface . clone ( ) )
339368 . script_tun ( self . args . script_tun )
340- . user_agent ( self . args . user_agent . clone ( ) )
369+ . user_agent ( self . user_agent ( ) . into_owned ( ) )
341370 . os ( Some ( os) )
371+ . os_version ( Some ( os_version) )
342372 . client_version ( client_version)
343373 . certificate ( self . args . certificate . clone ( ) )
344374 . sslkey ( self . args . sslkey . clone ( ) )
@@ -394,10 +424,11 @@ impl<'a> ConnectHandler<'a> {
394424
395425 let os_version = self . args . os_version ( ) ;
396426 let verbose = self . shared_args . verbose . to_verbose_arg ( ) ;
427+ let user_agent = self . user_agent ( ) ;
397428 let auth_launcher = SamlAuthLauncher :: new ( & self . args . server )
398429 . gateway ( is_gateway)
399430 . saml_request ( prelogin. saml_request ( ) )
400- . user_agent ( & self . args . user_agent )
431+ . user_agent ( & user_agent)
401432 . os ( self . args . os . as_str ( ) )
402433 . os_version ( Some ( & os_version) )
403434 . fix_openssl ( self . shared_args . fix_openssl )
0 commit comments