ability.rs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. use axum::{extract::{State},Json};
  2. use super::{Ident,check_token};
  3. use crate::{AppState, LogLevel::*, datasource::Datasource, log};
  4. #[derive(serde::Serialize)]
  5. pub struct MqttBack{
  6. pub errcode: i16,
  7. #[serde(skip_serializing_if = "Option::is_none")]
  8. pub errmsg: Option<String>,
  9. #[serde(skip_serializing_if = "Option::is_none")]
  10. pub clientid: Option<String>,
  11. #[serde(skip_serializing_if = "Option::is_none")]
  12. pub mqttu: Option<String>,
  13. #[serde(skip_serializing_if = "Option::is_none")]
  14. pub mqttp: Option<String>
  15. }
  16. // pub async fn get_mqtt(
  17. // State(state): State<AppState>,
  18. // Json(u): axum::extract::Json<Ident>
  19. // ) -> Json<MqttBack> {
  20. // let (uid,_) = match check_token(&state, u.token).await {
  21. // Ok(id) => {id},
  22. // Err(_) => {
  23. // return Json(MqttBack{errcode: 2000, errmsg: Some("鉴权失败: token无效".to_string()),mqttp:None,clientid:None,mqttu:None})
  24. // }
  25. // };
  26. // let mut mqid:String;
  27. // match state.db_lite.query("select mqid from user where id=?", [uid], |r|{r.get::<usize,String>(0)}).await{
  28. // Ok(clientid)=>{
  29. // mqid=clientid;
  30. // // if clientid.is_empty(){
  31. // // mqid = format!("webu{}",super::token(5));
  32. // // }else{
  33. // // if let Err(e)=tokio::fs::remove_file(format!("/var/lib/mosquitto/{}",clientid)).await{
  34. // // log(Warning, format!("fail to remove old mqtt user file {e}"))
  35. // // };
  36. // // mqid=clientid;
  37. // // }
  38. // }
  39. // Err(e) => {
  40. // if !e.is_empty(){
  41. // log(Error, format!("query mqid failed: {e}"));
  42. // return Json(MqttBack{errcode: 3000, errmsg: Some("数据库异常: 获取用户信息失败".to_string()),mqttp:None,clientid:None,mqttu:None});
  43. // }
  44. // mqid="".to_string();
  45. // }
  46. // }
  47. // if mqid.is_empty(){
  48. // let mut mq: String;
  49. // let mut try_time=0;
  50. // loop{// 确保获取不重复的clientid,mqid设定为unique
  51. // if try_time>5{
  52. // return Json(MqttBack{errcode: 3000, errmsg: Some("数据库异常: 无法为用户绑定新clientid, 因为当前已经存在太多用户".to_string()),mqttp:None,clientid:None,mqttu:None});
  53. // }
  54. // match state.db_lite.execute("update user set mqid=? where id=?", ({mq=format!("webu{}",super::token(5));mq.clone()},uid)).await{
  55. // Ok(_) => {mqid=mq;break;},
  56. // Err(e) => {
  57. // if e.is_empty(){
  58. // try_time+=1;
  59. // continue;
  60. // }
  61. // log(Error, format!("update mqid failed: {e}"));
  62. // return Json(MqttBack{errcode: 3000, errmsg: Some("数据库异常: 未能绑定mqtt-clientid到用户".to_string()),mqttp:None,clientid:None,mqttu:None})
  63. // }
  64. // };
  65. // }
  66. // }
  67. // let (mqtp, mqtu): (String,String);
  68. // match tokio::fs::File::create(format!("/var/lib/mosquitto/user/{mqid}")).await{
  69. // Ok(mut f) => {
  70. // (mqtu,mqtp) = (super::token(12),super::token(12));
  71. // if let Err(e)=f.write(
  72. // format!("{}\n{}\n1\n{}",mqtu.clone(),mqtp.clone(),
  73. // if let Ok(t)=(std::time::SystemTime::now()+std::time::Duration::from_mins(10)).duration_since(std::time::UNIX_EPOCH){
  74. // t.as_secs()
  75. // }else{0}
  76. // ).as_bytes()
  77. // ).await{
  78. // log(Warning, format!("mqtt user file write failed {e}"));
  79. // };
  80. // },
  81. // Err(e) => {
  82. // log(Warning, format!("mqtt user file create failed {e}"));
  83. // return Json(MqttBack{errcode: 3000, errmsg: Some("数据库异常: 创建用户文件失败".to_string()),mqttp:None,clientid:None,mqttu:None});
  84. // }
  85. // };
  86. // match state.db_lite.query_rows("select d.sn from device d left join map_user_device m on d.id=m.did where m.uid=?", [uid], |r|{r.get::<usize,String>(0)}).await{
  87. // Ok(r)=>{
  88. // // log(Debug, format!("get mqtt sub list{:?}",r));
  89. // let mut fsub = if let Ok(f)=tokio::fs::File::create(format!("/var/lib/mosquitto/sub/{}",mqid)).await{f}else{
  90. // log(Warning, format!("fail at mqtt sub create"));
  91. // return Json(MqttBack{errcode: 3000, errmsg: Some("mqtt鉴权失败: 创建用户文件失败".to_string()),mqttp:None,clientid:None,mqttu:None});
  92. // };
  93. // let mut fpub = if let Ok(f)=tokio::fs::File::create(format!("/var/lib/mosquitto/pub/{}",mqid)).await{f}else{
  94. // log(Warning, format!("fail at mqtt pub create"));
  95. // return Json(MqttBack{errcode: 3000, errmsg: Some("mqtt鉴权失败: 创建用户文件失败".to_string()),mqttp:None,clientid:None,mqttu:None});
  96. // };
  97. // if !r.is_empty(){
  98. // if let Err(e)=fpub.write(format!("/wf/Iot/device/{}\n{}", r.join("\n/wf/Iot/device/"),r.join("\n")).as_bytes()).await{
  99. // // if let Err(e)=fpub.write(format!("/wf/Iot/device/{}\n{}/+/cmd", r.join("\n/wf/Iot/device/"),r.join("/+/cmd\n")).as_bytes()).await{
  100. // log(Warning, format!("fail to write pub list to file {e}"));
  101. // };
  102. // if let Err(e)=fsub.write(format!("/wf/Iot/client/{}\n{}", r.join("\n/wf/Iot/client/"),r.join("\n")).as_bytes()).await{
  103. // // if let Err(e)=fsub.write(format!("/wf/Iot/client/{}\n{}/+/state", r.join("\n/wf/Iot/client/"),r.join("/+/state\n")).as_bytes()).await{
  104. // log(Warning, format!("fail to write sub list to file {e}"));
  105. // };
  106. // } else {
  107. // if let Err(e)=fpub.write(String::new().as_bytes()).await{
  108. // log(Warning, format!("fail to write pub list to file {e}"));
  109. // };
  110. // if let Err(e)=fsub.write(String::new().as_bytes()).await{
  111. // log(Warning, format!("fail to write sub list to file {e}"));
  112. // };
  113. // }
  114. // }
  115. // Err(e) => {
  116. // if !e.is_empty(){
  117. // return Json(MqttBack{errcode: 3000, errmsg: Some("mqtt鉴权失败: 获取用户下属清单失败".to_string()),mqttp:None,clientid:None,mqttu:None});
  118. // }
  119. // }
  120. // }
  121. // return Json(MqttBack{errcode: 0, errmsg: None,mqttp:Some(mqtp),clientid:Some(mqid),mqttu:Some(mqtu)})
  122. // }
  123. pub async fn get_mqtt(
  124. State(state): State<AppState>,
  125. Json(u): axum::extract::Json<Ident>
  126. ) -> Json<MqttBack> {
  127. let (uid,_) = match check_token(&state, u.token).await {
  128. Ok(id) => {id},
  129. Err(_) => {
  130. return Json(MqttBack{errcode: 2000, errmsg: Some("鉴权失败: token无效".to_string()),mqttp:None,clientid:None,mqttu:None})
  131. }
  132. };
  133. let (mqtp, mqtu): (String,String) = (super::token(12),super::token(12));
  134. let mqid = if let Ok(s) = state.db_lite.query("select mqid from user where id=?", [uid], |r|{r.get::<usize,String>(0)}).await{
  135. s
  136. }else{
  137. return Json(MqttBack{errcode: 3000, errmsg: Some("数据库异常: 获取用户mqtt-clientid失败".to_string()),mqttp:None,clientid:None,mqttu:None});
  138. };
  139. if let Some(d) = state.mq_detail{
  140. if let Err(e)=d.db_mq_user.execute("update user set user=?, pass=? where clientid=?", (mqtu.clone(),mqtp.clone(),mqid.clone())).await{
  141. log(Warning, format!("fail to update mqttuser: {e}"));
  142. }
  143. }
  144. return Json(MqttBack{errcode: 0, errmsg: None,mqttp:Some(mqtp),clientid:Some(mqid),mqttu:Some(mqtu)});
  145. }
  146. #[test]
  147. fn test_f(){
  148. use tokio::io::{AsyncReadExt};
  149. tokio::runtime::Runtime::new().unwrap().block_on(async{
  150. use tokio::io::{AsyncWriteExt};
  151. match tokio::fs::File::create("testf").await{
  152. Ok(mut f) =>{
  153. let buf: &mut [u8];
  154. let mut b = [0;1024];
  155. buf=b.as_mut_slice();
  156. if let Ok(n)=f.read(buf).await{println!("file read {}",n)};
  157. if let Ok(n)=f.write(format!("asdf").as_bytes()).await{println!("file write {}",n);
  158. if let Err(e)=f.flush().await{ println!("file flush failed: {}",e)};};
  159. }
  160. Err(e) => {
  161. // match tokio::fs::File::create("testf").await{
  162. // Ok(mut f) => {
  163. // println!("file create");
  164. // if let Err(e)=f.write(format!("creatt").as_bytes()).await{
  165. // println!("file write failed: {}",e);
  166. // };
  167. // }
  168. // Err(e) => {println!("file create failed: {}",e)}
  169. // }
  170. println!("file create failed: {}",e);
  171. }
  172. }
  173. })
  174. }