Spaces:
Running
Running
Upload main.rs
Browse files- src/main.rs +76 -2
src/main.rs
CHANGED
|
@@ -928,6 +928,7 @@ async fn mobile_gw(
|
|
| 928 |
("api_version", "1.0"),
|
| 929 |
("api_token", api_token),
|
| 930 |
("input", "3"),
|
|
|
|
| 931 |
("cid", cid.as_str()),
|
| 932 |
("api_key", MOBILE_API_KEY),
|
| 933 |
])
|
|
@@ -1112,6 +1113,65 @@ async fn web_login(email: &str, password_md5: &str) -> Result<String, String> {
|
|
| 1112 |
Ok(arl)
|
| 1113 |
}
|
| 1114 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1115 |
|
| 1116 |
async fn gw_light_call(
|
| 1117 |
client: &reqwest::Client,
|
|
@@ -1330,7 +1390,18 @@ async fn login(Json(req): Json<LoginReq>) -> impl IntoResponse {
|
|
| 1330 |
"uid": "",
|
| 1331 |
"access_token": null
|
| 1332 |
}))).into_response(),
|
| 1333 |
-
Err(e2) =>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1334 |
}
|
| 1335 |
}
|
| 1336 |
}
|
|
@@ -1699,7 +1770,10 @@ async fn pair_complete(State(state): State<AppState>, Form(f): Form<PairComplete
|
|
| 1699 |
Ok(arl) => Ok(arl),
|
| 1700 |
Err(e1) => match web_login(&email, &pass_md5).await {
|
| 1701 |
Ok(arl) => Ok(arl),
|
| 1702 |
-
Err(e2) =>
|
|
|
|
|
|
|
|
|
|
| 1703 |
},
|
| 1704 |
};
|
| 1705 |
|
|
|
|
| 928 |
("api_version", "1.0"),
|
| 929 |
("api_token", api_token),
|
| 930 |
("input", "3"),
|
| 931 |
+
("output", "3"),
|
| 932 |
("cid", cid.as_str()),
|
| 933 |
("api_key", MOBILE_API_KEY),
|
| 934 |
])
|
|
|
|
| 1113 |
Ok(arl)
|
| 1114 |
}
|
| 1115 |
|
| 1116 |
+
fn worker_base() -> Option<String> {
|
| 1117 |
+
let env = std::env::var("DZMEDIA_WORKER").ok().unwrap_or_default();
|
| 1118 |
+
let base = env.trim();
|
| 1119 |
+
if base.is_empty() || base == "-" {
|
| 1120 |
+
return None;
|
| 1121 |
+
}
|
| 1122 |
+
Some(base.trim_end_matches('/').to_string())
|
| 1123 |
+
}
|
| 1124 |
+
|
| 1125 |
+
#[derive(Serialize)]
|
| 1126 |
+
struct WorkerLoginReq<'a> {
|
| 1127 |
+
email: &'a str,
|
| 1128 |
+
password_md5: &'a str,
|
| 1129 |
+
}
|
| 1130 |
+
|
| 1131 |
+
#[derive(Deserialize)]
|
| 1132 |
+
struct WorkerLoginResp {
|
| 1133 |
+
arl: Option<String>,
|
| 1134 |
+
error: Option<String>,
|
| 1135 |
+
}
|
| 1136 |
+
|
| 1137 |
+
async fn worker_login(email: &str, password_md5: &str) -> Result<String, String> {
|
| 1138 |
+
let Some(base) = worker_base() else {
|
| 1139 |
+
return Err("worker:disabled".to_string());
|
| 1140 |
+
};
|
| 1141 |
+
let url = format!("{base}/login");
|
| 1142 |
+
|
| 1143 |
+
let client = reqwest::Client::builder()
|
| 1144 |
+
.no_proxy()
|
| 1145 |
+
.timeout(std::time::Duration::from_secs(25))
|
| 1146 |
+
.build()
|
| 1147 |
+
.map_err(|_| "worker:client".to_string())?;
|
| 1148 |
+
|
| 1149 |
+
let r = client
|
| 1150 |
+
.post(url)
|
| 1151 |
+
.json(&WorkerLoginReq { email, password_md5 })
|
| 1152 |
+
.send()
|
| 1153 |
+
.await
|
| 1154 |
+
.map_err(|_| "worker:network".to_string())?;
|
| 1155 |
+
|
| 1156 |
+
let status = r.status();
|
| 1157 |
+
let text = r.text().await.map_err(|_| "worker:read".to_string())?;
|
| 1158 |
+
if !status.is_success() {
|
| 1159 |
+
let snip: String = text.chars().take(200).collect();
|
| 1160 |
+
return Err(format!("worker:http:{}:{}", status.as_u16(), snip));
|
| 1161 |
+
}
|
| 1162 |
+
let v: WorkerLoginResp = serde_json::from_str(&text).map_err(|_| {
|
| 1163 |
+
let snip: String = text.chars().take(200).collect();
|
| 1164 |
+
format!("worker:parse:{snip}")
|
| 1165 |
+
})?;
|
| 1166 |
+
if let Some(arl) = v.arl {
|
| 1167 |
+
if arl.len() >= 100 {
|
| 1168 |
+
return Ok(arl);
|
| 1169 |
+
}
|
| 1170 |
+
return Err(format!("worker:arl_too_short:{}", arl.len()));
|
| 1171 |
+
}
|
| 1172 |
+
Err(format!("worker:error:{}", v.error.unwrap_or_else(|| "unknown".to_string())))
|
| 1173 |
+
}
|
| 1174 |
+
|
| 1175 |
|
| 1176 |
async fn gw_light_call(
|
| 1177 |
client: &reqwest::Client,
|
|
|
|
| 1390 |
"uid": "",
|
| 1391 |
"access_token": null
|
| 1392 |
}))).into_response(),
|
| 1393 |
+
Err(e2) => match worker_login(&email, &pass).await {
|
| 1394 |
+
Ok(arl) => (StatusCode::OK, Json(json!({
|
| 1395 |
+
"arl": arl,
|
| 1396 |
+
"token": null,
|
| 1397 |
+
"uid": "",
|
| 1398 |
+
"access_token": null
|
| 1399 |
+
}))).into_response(),
|
| 1400 |
+
Err(e3) => json_error(
|
| 1401 |
+
StatusCode::UNAUTHORIZED,
|
| 1402 |
+
format!("login_failed; mobile:{e1}; web:{e2}; worker:{e3}"),
|
| 1403 |
+
),
|
| 1404 |
+
},
|
| 1405 |
}
|
| 1406 |
}
|
| 1407 |
}
|
|
|
|
| 1770 |
Ok(arl) => Ok(arl),
|
| 1771 |
Err(e1) => match web_login(&email, &pass_md5).await {
|
| 1772 |
Ok(arl) => Ok(arl),
|
| 1773 |
+
Err(e2) => match worker_login(&email, &pass_md5).await {
|
| 1774 |
+
Ok(arl) => Ok(arl),
|
| 1775 |
+
Err(e3) => Err(format!("mobile:{e1}; web:{e2}; worker:{e3}")),
|
| 1776 |
+
},
|
| 1777 |
},
|
| 1778 |
};
|
| 1779 |
|