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