1. Список говнокодов пользователя 1rei

    Всего: 1

  2. Куча / Говнокод #26757

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    ```rust
    impl actix_web::FromRequest for Token {
        type Error = ApiError;
        type Future = Pin<Box<dyn Future<Output = Result<Self, Self::Error>>>>;
        type Config = ();
    
        fn from_request(req: &actix_web::HttpRequest, _: &mut actix_web::dev::Payload) -> Self::Future {
            match req.extensions().get::<Option<Self>>().map(Clone::clone) {
                Some(Some(v)) => Box::pin(async { Ok(v) }),
                None | Some(None) => {
                    let header = req.headers().get("Authorization").map(Clone::clone);
    
                    Box::pin(
                        web::Data::<Pool>::extract(req)
                            .map_err(ApiError::from)
                            .and_then(move |pool| {
                                async move {
                                    let header = header.ok_or(ApiError::authorization_required())?;
    
                                    let auth = header.to_str()?;
    
                                    let uuid = Uuid::parse_str(auth)
                                        .map_err(|_| ApiError::authorization_bad_token())?;
    
                                    let (_, token) = Self::find(&uuid, pool.get_conn().await?).await?;
    
                                    let token = token.ok_or(ApiError::authorization_bad_token())?;
    
                                    Ok(token)
                                }
                            })
                            .boxed_local()
                    )
                }
            }
        }
    }

    Было принято решение создать Authorization middleware, который при каждом запросе авторизировал пользователя, если есть нужный хидер. В связи с тем, что некоторые роуты достают модель через ручной экстрактор, пришлось дописать эту хуйню (Второе условие никогда не будет выполнена вообще судя по всему).

    1rei, 18 Июня 2020

    Комментарии (9)