recycleactor commited on
Commit
f92fb8a
·
verified ·
1 Parent(s): ce54b28

Upload main.rs

Browse files
Files changed (1) hide show
  1. src/main.rs +60 -30
src/main.rs CHANGED
@@ -1155,6 +1155,7 @@ async fn login(Json(req): Json<LoginReq>) -> impl IntoResponse {
1155
  struct PairSession {
1156
  created_ms: u128,
1157
  access_token: Option<String>,
 
1158
  user_id: Option<String>,
1159
  email: Option<String>,
1160
  arl: Option<String>,
@@ -1188,6 +1189,7 @@ async fn pair_start(State(state): State<AppState>) -> impl IntoResponse {
1188
  PairSession {
1189
  created_ms,
1190
  access_token: None,
 
1191
  user_id: None,
1192
  email: None,
1193
  arl: None,
@@ -1221,14 +1223,14 @@ async fn pair_status(State(state): State<AppState>, Query(q): Query<PairStatusQu
1221
  if let Some(tok) = &sess.access_token {
1222
  return (
1223
  StatusCode::OK,
1224
- Json(json!({ "status": "ok", "access_token": tok, "user_id": sess.user_id, "email": sess.email, "arl": sess.arl })),
1225
  )
1226
  .into_response();
1227
  }
1228
  if sess.arl.as_deref().unwrap_or("").len() > 20 {
1229
  return (
1230
  StatusCode::OK,
1231
- Json(json!({ "status": "ok", "access_token": null, "user_id": sess.user_id, "email": sess.email, "arl": sess.arl })),
1232
  )
1233
  .into_response();
1234
  }
@@ -1421,6 +1423,8 @@ async fn pair_complete(State(state): State<AppState>, Form(f): Form<PairComplete
1421
  let mut uid: Option<String> = None;
1422
  let mut arl_out: Option<String> = None;
1423
  let mut login_err: Option<String> = None;
 
 
1424
 
1425
  match oauth_access_token(&client, &email, &pass_md5).await {
1426
  Ok(t) => access_token = Some(t),
@@ -1475,44 +1479,67 @@ async fn pair_complete(State(state): State<AppState>, Form(f): Form<PairComplete
1475
  }
1476
 
1477
  if arl_out.is_none() {
1478
- if let Ok(ud) = gw_light_call(&client, "deezer.getUserData", "null", json!({})).await {
1479
- let token = ud["checkForm"].as_str().unwrap_or("").to_string();
1480
- if !token.is_empty() {
1481
- match gw_light_call(&client, "user.getArl", &token, json!({})).await {
1482
- Ok(v) => {
1483
- if let Some(s) = v.as_str() {
1484
- if s.len() > 20 {
1485
- arl_out = Some(s.to_string());
1486
- }
1487
- }
1488
- }
1489
- Err(_) => {
1490
- let _ = gw_light_call(
1491
- &client,
1492
- "user.checkCredentials",
1493
- &token,
1494
- json!({
1495
- "login": email,
1496
- "password": pass_md5,
1497
- "checkFormLogin": token
1498
- }),
1499
- )
1500
- .await;
1501
- if let Ok(v2) = gw_light_call(&client, "user.getArl", &token, json!({})).await {
1502
- if let Some(s) = v2.as_str() {
1503
- if s.len() > 20 {
1504
- arl_out = Some(s.to_string());
 
 
 
 
 
 
 
1505
  }
1506
  }
 
 
 
 
 
 
1507
  }
1508
  }
 
 
1509
  }
1510
  }
 
 
 
1511
  }
1512
  }
1513
 
1514
  if access_token.is_none() && arl_out.as_deref().unwrap_or("").len() < 20 {
1515
- let msg = login_err.unwrap_or_else(|| "login_failed".to_string());
 
 
 
 
 
1516
  let mut map = state.pair.write().await;
1517
  if let Some(s) = map.get_mut(&code) {
1518
  s.error = Some(msg.clone());
@@ -1524,6 +1551,9 @@ async fn pair_complete(State(state): State<AppState>, Form(f): Form<PairComplete
1524
  let mut map = state.pair.write().await;
1525
  if let Some(s) = map.get_mut(&code) {
1526
  s.access_token = access_token;
 
 
 
1527
  s.user_id = uid;
1528
  s.email = Some(email);
1529
  s.arl = arl_out;
 
1155
  struct PairSession {
1156
  created_ms: u128,
1157
  access_token: Option<String>,
1158
+ token: Option<String>,
1159
  user_id: Option<String>,
1160
  email: Option<String>,
1161
  arl: Option<String>,
 
1189
  PairSession {
1190
  created_ms,
1191
  access_token: None,
1192
+ token: None,
1193
  user_id: None,
1194
  email: None,
1195
  arl: None,
 
1223
  if let Some(tok) = &sess.access_token {
1224
  return (
1225
  StatusCode::OK,
1226
+ Json(json!({ "status": "ok", "access_token": tok, "token": sess.token, "user_id": sess.user_id, "email": sess.email, "arl": sess.arl })),
1227
  )
1228
  .into_response();
1229
  }
1230
  if sess.arl.as_deref().unwrap_or("").len() > 20 {
1231
  return (
1232
  StatusCode::OK,
1233
+ Json(json!({ "status": "ok", "access_token": null, "token": sess.token, "user_id": sess.user_id, "email": sess.email, "arl": sess.arl })),
1234
  )
1235
  .into_response();
1236
  }
 
1423
  let mut uid: Option<String> = None;
1424
  let mut arl_out: Option<String> = None;
1425
  let mut login_err: Option<String> = None;
1426
+ let mut gw_token: Option<String> = None;
1427
+ let mut gw_err: Option<String> = None;
1428
 
1429
  match oauth_access_token(&client, &email, &pass_md5).await {
1430
  Ok(t) => access_token = Some(t),
 
1479
  }
1480
 
1481
  if arl_out.is_none() {
1482
+ match gw_light_call(&client, "deezer.getUserData", "null", json!({})).await {
1483
+ Ok(ud) => {
1484
+ let token = ud["checkForm"].as_str().unwrap_or("").to_string();
1485
+ let gw_uid = ud["USER"]["USER_ID"]
1486
+ .as_i64()
1487
+ .map(|n| n.to_string())
1488
+ .unwrap_or_default();
1489
+ if !gw_uid.is_empty() && uid.is_none() {
1490
+ uid = Some(gw_uid);
1491
+ }
1492
+ if !token.is_empty() {
1493
+ gw_token = Some(token.clone());
1494
+ match gw_light_call(
1495
+ &client,
1496
+ "user.checkCredentials",
1497
+ &token,
1498
+ json!({
1499
+ "login": email,
1500
+ "password": pass_md5,
1501
+ "checkFormLogin": token
1502
+ }),
1503
+ )
1504
+ .await
1505
+ {
1506
+ Ok(_) => match gw_light_call(&client, "user.getArl", &token, json!({})).await {
1507
+ Ok(v) => {
1508
+ if let Some(s) = v.as_str() {
1509
+ if s.len() > 20 {
1510
+ arl_out = Some(s.to_string());
1511
+ } else {
1512
+ gw_err = Some("gw:no_arl".to_string());
1513
+ }
1514
+ } else {
1515
+ gw_err = Some("gw:no_arl".to_string());
1516
  }
1517
  }
1518
+ Err(e) => {
1519
+ gw_err = Some(format!("gw:getArl:{e}"));
1520
+ }
1521
+ },
1522
+ Err(e) => {
1523
+ gw_err = Some(format!("gw:checkCredentials:{e}"));
1524
  }
1525
  }
1526
+ } else {
1527
+ gw_err = Some("gw:no_checkForm".to_string());
1528
  }
1529
  }
1530
+ Err(e) => {
1531
+ gw_err = Some(format!("gw:getUserData:{e}"));
1532
+ }
1533
  }
1534
  }
1535
 
1536
  if access_token.is_none() && arl_out.as_deref().unwrap_or("").len() < 20 {
1537
+ let msg = match (login_err, gw_err) {
1538
+ (Some(a), Some(b)) => format!("{a}; {b}"),
1539
+ (Some(a), None) => a,
1540
+ (None, Some(b)) => b,
1541
+ (None, None) => "login_failed".to_string(),
1542
+ };
1543
  let mut map = state.pair.write().await;
1544
  if let Some(s) = map.get_mut(&code) {
1545
  s.error = Some(msg.clone());
 
1551
  let mut map = state.pair.write().await;
1552
  if let Some(s) = map.get_mut(&code) {
1553
  s.access_token = access_token;
1554
+ if gw_token.is_some() {
1555
+ s.token = gw_token;
1556
+ }
1557
  s.user_id = uid;
1558
  s.email = Some(email);
1559
  s.arl = arl_out;