salt.rs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. use std::sync::Mutex;
  2. use lazy_static::lazy_static;
  3. use uuid::Uuid;
  4. use web_view::WebView;
  5. struct Salt {
  6. value: String,
  7. one_time: bool,
  8. }
  9. lazy_static! {
  10. static ref SALTS: Mutex<Vec<Salt>> = Mutex::new(vec![]);
  11. }
  12. pub fn generate() -> String {
  13. let salt = Uuid::new_v4();
  14. SALTS
  15. .lock()
  16. .expect("Failed to lock Salt mutex: generate()")
  17. .push(Salt {
  18. value: salt.to_string(),
  19. one_time: true,
  20. });
  21. salt.to_string()
  22. }
  23. pub fn generate_static() -> String {
  24. let salt = Uuid::new_v4();
  25. SALTS
  26. .lock()
  27. .expect("Failed to lock SALT mutex: generate_static()")
  28. .push(Salt {
  29. value: salt.to_string(),
  30. one_time: false,
  31. });
  32. salt.to_string()
  33. }
  34. pub fn is_valid(salt: String) -> bool {
  35. let mut salts = SALTS.lock().expect("Failed to lock Salt mutex: is_valid()");
  36. match salts.iter().position(|s| s.value == salt) {
  37. Some(index) => {
  38. if salts[index].one_time {
  39. salts.remove(index);
  40. }
  41. true
  42. }
  43. None => false,
  44. }
  45. }
  46. pub fn validate<T: 'static>(
  47. webview: &mut WebView<'_, T>,
  48. salt: String,
  49. callback: String,
  50. error: String,
  51. ) {
  52. let response = if is_valid(salt) {
  53. Ok("'VALID'".to_string())
  54. } else {
  55. Err("'INVALID SALT'".to_string())
  56. };
  57. let callback_string = crate::api::rpc::format_callback_result(response, callback, error);
  58. webview
  59. .eval(callback_string.as_str())
  60. .expect("Failed to eval JS from validate()");
  61. }