mirror of
				https://github.com/yuezk/GlobalProtect-openconnect.git
				synced 2025-05-20 07:26:58 -04:00 
			
		
		
		
	Perform gateway prelogin when failed to login to gateway
This commit is contained in:
		| @@ -44,6 +44,7 @@ impl ClientOs { | ||||
|  | ||||
| #[derive(Debug, Serialize, Deserialize, Type, Default)] | ||||
| pub struct GpParams { | ||||
|   is_gateway: bool, | ||||
|   user_agent: String, | ||||
|   client_os: ClientOs, | ||||
|   os_version: Option<String>, | ||||
| @@ -58,6 +59,14 @@ impl GpParams { | ||||
|     GpParamsBuilder::new() | ||||
|   } | ||||
|  | ||||
|   pub(crate) fn is_gateway(&self) -> bool { | ||||
|     self.is_gateway | ||||
|   } | ||||
|  | ||||
|   pub fn set_is_gateway(&mut self, is_gateway: bool) { | ||||
|     self.is_gateway = is_gateway; | ||||
|   } | ||||
|  | ||||
|   pub(crate) fn user_agent(&self) -> &str { | ||||
|     &self.user_agent | ||||
|   } | ||||
| @@ -103,6 +112,7 @@ impl GpParams { | ||||
| } | ||||
|  | ||||
| pub struct GpParamsBuilder { | ||||
|   is_gateway: bool, | ||||
|   user_agent: String, | ||||
|   client_os: ClientOs, | ||||
|   os_version: Option<String>, | ||||
| @@ -115,6 +125,7 @@ pub struct GpParamsBuilder { | ||||
| impl GpParamsBuilder { | ||||
|   pub fn new() -> Self { | ||||
|     Self { | ||||
|       is_gateway: false, | ||||
|       user_agent: GP_USER_AGENT.to_string(), | ||||
|       client_os: ClientOs::Linux, | ||||
|       os_version: Default::default(), | ||||
| @@ -125,6 +136,11 @@ impl GpParamsBuilder { | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   pub fn is_gateway(&mut self, is_gateway: bool) -> &mut Self { | ||||
|     self.is_gateway = is_gateway; | ||||
|     self | ||||
|   } | ||||
|  | ||||
|   pub fn user_agent(&mut self, user_agent: &str) -> &mut Self { | ||||
|     self.user_agent = user_agent.to_string(); | ||||
|     self | ||||
| @@ -162,6 +178,7 @@ impl GpParamsBuilder { | ||||
|  | ||||
|   pub fn build(&self) -> GpParams { | ||||
|     GpParams { | ||||
|       is_gateway: self.is_gateway, | ||||
|       user_agent: self.user_agent.clone(), | ||||
|       client_os: self.client_os.clone(), | ||||
|       os_version: self.os_version.clone(), | ||||
|   | ||||
| @@ -102,12 +102,6 @@ impl PortalConfig { | ||||
| pub enum PortalConfigError { | ||||
|   #[error("Empty response, retrying can help")] | ||||
|   EmptyResponse, | ||||
|   #[error("Empty auth cookie, retrying can help")] | ||||
|   EmptyAuthCookie, | ||||
|   #[error("Invalid auth cookie, retrying can help")] | ||||
|   InvalidAuthCookie, | ||||
|   #[error("Empty gateways, retrying can help")] | ||||
|   EmptyGateways, | ||||
| } | ||||
|  | ||||
| pub async fn retrieve_config( | ||||
| @@ -139,24 +133,22 @@ pub async fn retrieve_config( | ||||
|   ensure!(!res_xml.is_empty(), PortalConfigError::EmptyResponse); | ||||
|  | ||||
|   let doc = Document::parse(&res_xml)?; | ||||
|   let gateways = parse_gateways(&doc).ok_or_else(|| anyhow::anyhow!("Failed to parse gateways"))?; | ||||
|   let mut gateways = | ||||
|     parse_gateways(&doc).ok_or_else(|| anyhow::anyhow!("Failed to parse gateways"))?; | ||||
|  | ||||
|   let user_auth_cookie = xml::get_child_text(&doc, "portal-userauthcookie").unwrap_or_default(); | ||||
|   let prelogon_user_auth_cookie = | ||||
|     xml::get_child_text(&doc, "portal-prelogonuserauthcookie").unwrap_or_default(); | ||||
|   let config_digest = xml::get_child_text(&doc, "config-digest"); | ||||
|  | ||||
|   ensure!( | ||||
|     !user_auth_cookie.is_empty() && !prelogon_user_auth_cookie.is_empty(), | ||||
|     PortalConfigError::EmptyAuthCookie | ||||
|   ); | ||||
|  | ||||
|   ensure!( | ||||
|     user_auth_cookie != "empty" && prelogon_user_auth_cookie != "empty", | ||||
|     PortalConfigError::InvalidAuthCookie | ||||
|   ); | ||||
|  | ||||
|   ensure!(!gateways.is_empty(), PortalConfigError::EmptyGateways); | ||||
|   if gateways.is_empty() { | ||||
|     gateways.push(Gateway { | ||||
|       name: server.to_string(), | ||||
|       address: server.to_string(), | ||||
|       priority: 0, | ||||
|       priority_rules: vec![], | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   Ok(PortalConfig::new( | ||||
|     server.to_string(), | ||||
|   | ||||
| @@ -91,11 +91,17 @@ pub async fn prelogin(portal: &str, gp_params: &GpParams) -> anyhow::Result<Prel | ||||
|   info!("Portal prelogin, user_agent: {}", user_agent); | ||||
|  | ||||
|   let portal = normalize_server(portal)?; | ||||
|   let prelogin_url = format!("{}/global-protect/prelogin.esp", portal); | ||||
|   let prelogin_url = format!( | ||||
|     "{portal}/{}/prelogin.esp", | ||||
|     if gp_params.is_gateway() { | ||||
|       "ssl-vpn" | ||||
|     } else { | ||||
|       "global-protect" | ||||
|     } | ||||
|   ); | ||||
|   let mut params = gp_params.to_params(); | ||||
|  | ||||
|   params.insert("tmp", "tmp"); | ||||
|   params.insert("cas-support", "yes"); | ||||
|   if gp_params.prefer_default_browser() { | ||||
|     params.insert("default-browser", "1"); | ||||
|   } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user