recycleactor commited on
Commit
6594f2e
·
verified ·
1 Parent(s): ce85d43

Upload main.rs

Browse files
Files changed (1) hide show
  1. 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) => json_error(StatusCode::UNAUTHORIZED, format!("login_failed; mobile:{e1}; web:{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) => Err(format!("mobile:{e1}; web:{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