decrypt_cookies/firefox/
mod.rs

1pub 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    /// filter by condition
38    ///
39    /// # Example
40    ///
41    /// ```rust,ignore
42    /// use decrypt_cookies::{firefox::MozCookiesCol, Browser, FirefoxBuilder, ColumnTrait};
43    ///
44    /// #[tokio::main]
45    /// async fn main() {
46    ///     let ffget = FirefoxBuilder::new(Firefox::new().unwrap())
47    ///         .build()
48    ///         .await
49    ///         .unwrap();
50    ///     let res = ffget
51    ///         .cookies_filter(MozCookiesCol::Host.contains("mozilla.com"))
52    ///         .await
53    ///         .unwrap_or_default();
54    /// }
55    /// ```
56    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    /// get session csrf for leetcode
96    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}