decrypt_cookies/firefox/
mod.rs1pub mod builder;
2pub mod items;
3
4use std::marker::PhantomData;
5
6use chrono::Utc;
7use rayon::prelude::{IntoParallelIterator, ParallelIterator};
8use sea_orm::{prelude::ColumnTrait, sea_query::IntoCondition, DbErr};
9
10pub use self::items::cookie::entities::moz_cookies::{
11 Column as MozCookiesCol, ColumnIter as MozCookiesColIter,
12};
13use self::items::{
14 cookie::{dao::CookiesQuery, MozCookies},
15 I64ToMozTime,
16};
17use crate::browser::cookies::LeetCodeCookies;
18
19#[derive(Debug)]
20#[derive(thiserror::Error)]
21pub enum FirefoxError {
22 #[error(transparent)]
23 Db(#[from] DbErr),
24}
25
26type Result<T> = std::result::Result<T, FirefoxError>;
27
28#[derive(Clone)]
29#[derive(Debug)]
30#[derive(Default)]
31pub struct FirefoxGetter<T> {
32 pub(crate) cookies_query: CookiesQuery,
33 pub(crate) __browser: PhantomData<T>,
34}
35
36impl<T: Send + Sync> FirefoxGetter<T> {
37 pub async fn cookies_filter<F>(&self, filter: F) -> Result<Vec<MozCookies>>
57 where
58 F: IntoCondition + Send,
59 {
60 let res = self
61 .cookies_query
62 .query_cookie_filter(filter)
63 .await?;
64 let res = res
65 .into_par_iter()
66 .map(MozCookies::from)
67 .collect();
68 Ok(res)
69 }
70
71 pub async fn all_cookies(&self) -> Result<Vec<MozCookies>> {
72 let res = self
73 .cookies_query
74 .query_all_cookie()
75 .await?;
76 let res = res
77 .into_par_iter()
78 .map(MozCookies::from)
79 .collect();
80 Ok(res)
81 }
82
83 pub async fn cookies_by_host(&self, host: &str) -> Result<Vec<MozCookies>> {
84 let res = self
85 .cookies_query
86 .query_cookie_by_host(host)
87 .await?;
88 let res = res
89 .into_par_iter()
90 .map(MozCookies::from)
91 .collect();
92 Ok(res)
93 }
94
95 pub async fn get_session_csrf(&self, host: &str) -> Result<LeetCodeCookies> {
97 let cookies = self
98 .cookies_query
99 .query_cookie_filter(
100 MozCookiesCol::Host
101 .contains(host)
102 .and(
103 MozCookiesCol::Name
104 .eq("csrftoken")
105 .or(MozCookiesCol::Name.eq("LEETCODE_SESSION")),
106 ),
107 )
108 .await?;
109
110 let mut res = LeetCodeCookies::default();
111
112 for cookie in cookies {
113 if let Some(s) = cookie.name {
114 if s == "csrftoken" {
115 let expir = cookie
116 .expiry
117 .unwrap_or_default()
118 .secs_to_moz_utc();
119 if let Some(expir) = expir {
120 if Utc::now() > expir {
121 res.expiry = true;
122 break;
123 }
124 }
125
126 res.csrf = cookie.value.unwrap_or_default();
127 }
128 else if s == "LEETCODE_SESSION" {
129 let expir = cookie
130 .expiry
131 .unwrap_or_default()
132 .secs_to_moz_utc();
133 if let Some(expir) = expir {
134 if Utc::now() > expir {
135 res.expiry = true;
136 break;
137 }
138 }
139
140 res.session = cookie.value.unwrap_or_default();
141 }
142 }
143 }
144 Ok(res)
145 }
146}