atagen

macltok

public
Star0
Watch0
a951cb7cb7cab29ddf841442899e1e5da3a71249
3
ssh://brewery@pls.lobotomise.me:33/atagen/macltok.git

Blame: src/uiaa.rs

96fdf90aacd6atagen2026-09-08 08:24 UTC1
use std::fmt;
96fdf90aacd6atagen2026-09-08 08:24 UTC2
96fdf90aacd6atagen2026-09-08 08:24 UTC3
use ruma::{UserId, api::client::uiaa, serde::JsonObject};
96fdf90aacd6atagen2026-09-08 08:24 UTC4
#[cfg(feature = "serde")]
96fdf90aacd6atagen2026-09-08 08:24 UTC5
use serde::{Deserialize, Serialize};
96fdf90aacd6atagen2026-09-08 08:24 UTC6
96fdf90aacd6atagen2026-09-08 08:24 UTC7
#[derive(Eq, PartialEq)]
96fdf90aacd6atagen2026-09-08 08:24 UTC8
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
96fdf90aacd6atagen2026-09-08 08:24 UTC9
#[non_exhaustive]
96fdf90aacd6atagen2026-09-08 08:24 UTC10
pub enum InteractiveAuth {
96fdf90aacd6atagen2026-09-08 08:24 UTC11
    Password {
96fdf90aacd6atagen2026-09-08 08:24 UTC12
        password: String,
96fdf90aacd6atagen2026-09-08 08:24 UTC13
        session: Option<String>,
96fdf90aacd6atagen2026-09-08 08:24 UTC14
    },
96fdf90aacd6atagen2026-09-08 08:24 UTC15
    ReCaptcha {
96fdf90aacd6atagen2026-09-08 08:24 UTC16
        response: String,
96fdf90aacd6atagen2026-09-08 08:24 UTC17
        session: Option<String>,
96fdf90aacd6atagen2026-09-08 08:24 UTC18
    },
96fdf90aacd6atagen2026-09-08 08:24 UTC19
    Dummy {
96fdf90aacd6atagen2026-09-08 08:24 UTC20
        session: Option<String>,
96fdf90aacd6atagen2026-09-08 08:24 UTC21
    },
96fdf90aacd6atagen2026-09-08 08:24 UTC22
    FallbackAcknowledgement {
96fdf90aacd6atagen2026-09-08 08:24 UTC23
        session: String,
96fdf90aacd6atagen2026-09-08 08:24 UTC24
    },
96fdf90aacd6atagen2026-09-08 08:24 UTC25
    OAuth {
96fdf90aacd6atagen2026-09-08 08:24 UTC26
        session: Option<String>,
96fdf90aacd6atagen2026-09-08 08:24 UTC27
    },
96fdf90aacd6atagen2026-09-08 08:24 UTC28
    Stage {
96fdf90aacd6atagen2026-09-08 08:24 UTC29
        auth_type: String,
96fdf90aacd6atagen2026-09-08 08:24 UTC30
        session: Option<String>,
96fdf90aacd6atagen2026-09-08 08:24 UTC31
        data: JsonObject,
96fdf90aacd6atagen2026-09-08 08:24 UTC32
    },
96fdf90aacd6atagen2026-09-08 08:24 UTC33
}
96fdf90aacd6atagen2026-09-08 08:24 UTC34
96fdf90aacd6atagen2026-09-08 08:24 UTC35
impl InteractiveAuth {
96fdf90aacd6atagen2026-09-08 08:24 UTC36
    #[must_use]
96fdf90aacd6atagen2026-09-08 08:24 UTC37
    pub fn password(password: impl Into<String>, session: Option<String>) -> Self {
96fdf90aacd6atagen2026-09-08 08:24 UTC38
        Self::Password {
96fdf90aacd6atagen2026-09-08 08:24 UTC39
            password: password.into(),
96fdf90aacd6atagen2026-09-08 08:24 UTC40
            session,
96fdf90aacd6atagen2026-09-08 08:24 UTC41
        }
96fdf90aacd6atagen2026-09-08 08:24 UTC42
    }
96fdf90aacd6atagen2026-09-08 08:24 UTC43
96fdf90aacd6atagen2026-09-08 08:24 UTC44
    #[must_use]
96fdf90aacd6atagen2026-09-08 08:24 UTC45
    pub fn recaptcha(response: impl Into<String>, session: Option<String>) -> Self {
96fdf90aacd6atagen2026-09-08 08:24 UTC46
        Self::ReCaptcha {
96fdf90aacd6atagen2026-09-08 08:24 UTC47
            response: response.into(),
96fdf90aacd6atagen2026-09-08 08:24 UTC48
            session,
96fdf90aacd6atagen2026-09-08 08:24 UTC49
        }
96fdf90aacd6atagen2026-09-08 08:24 UTC50
    }
96fdf90aacd6atagen2026-09-08 08:24 UTC51
96fdf90aacd6atagen2026-09-08 08:24 UTC52
    #[must_use]
96fdf90aacd6atagen2026-09-08 08:24 UTC53
    pub fn dummy(session: Option<String>) -> Self {
96fdf90aacd6atagen2026-09-08 08:24 UTC54
        Self::Dummy { session }
96fdf90aacd6atagen2026-09-08 08:24 UTC55
    }
96fdf90aacd6atagen2026-09-08 08:24 UTC56
96fdf90aacd6atagen2026-09-08 08:24 UTC57
    #[must_use]
96fdf90aacd6atagen2026-09-08 08:24 UTC58
    pub fn fallback_acknowledgement(session: impl Into<String>) -> Self {
96fdf90aacd6atagen2026-09-08 08:24 UTC59
        Self::FallbackAcknowledgement {
96fdf90aacd6atagen2026-09-08 08:24 UTC60
            session: session.into(),
96fdf90aacd6atagen2026-09-08 08:24 UTC61
        }
96fdf90aacd6atagen2026-09-08 08:24 UTC62
    }
96fdf90aacd6atagen2026-09-08 08:24 UTC63
96fdf90aacd6atagen2026-09-08 08:24 UTC64
    #[must_use]
96fdf90aacd6atagen2026-09-08 08:24 UTC65
    pub fn oauth(session: Option<String>) -> Self {
96fdf90aacd6atagen2026-09-08 08:24 UTC66
        Self::OAuth { session }
96fdf90aacd6atagen2026-09-08 08:24 UTC67
    }
96fdf90aacd6atagen2026-09-08 08:24 UTC68
96fdf90aacd6atagen2026-09-08 08:24 UTC69
    #[must_use]
96fdf90aacd6atagen2026-09-08 08:24 UTC70
    pub fn stage(auth_type: impl Into<String>, session: Option<String>, data: JsonObject) -> Self {
96fdf90aacd6atagen2026-09-08 08:24 UTC71
        Self::Stage {
96fdf90aacd6atagen2026-09-08 08:24 UTC72
            auth_type: auth_type.into(),
96fdf90aacd6atagen2026-09-08 08:24 UTC73
            session,
96fdf90aacd6atagen2026-09-08 08:24 UTC74
            data,
96fdf90aacd6atagen2026-09-08 08:24 UTC75
        }
96fdf90aacd6atagen2026-09-08 08:24 UTC76
    }
96fdf90aacd6atagen2026-09-08 08:24 UTC77
96fdf90aacd6atagen2026-09-08 08:24 UTC78
    pub(crate) fn into_sdk(self, user_id: &UserId) -> Result<uiaa::AuthData, String> {
96fdf90aacd6atagen2026-09-08 08:24 UTC79
        match self {
96fdf90aacd6atagen2026-09-08 08:24 UTC80
            Self::Password { password, session } => {
96fdf90aacd6atagen2026-09-08 08:24 UTC81
                let mut password = uiaa::Password::new(user_id.to_owned().into(), password);
96fdf90aacd6atagen2026-09-08 08:24 UTC82
                password.session = session;
96fdf90aacd6atagen2026-09-08 08:24 UTC83
                Ok(uiaa::AuthData::Password(password))
96fdf90aacd6atagen2026-09-08 08:24 UTC84
            }
96fdf90aacd6atagen2026-09-08 08:24 UTC85
            Self::ReCaptcha { response, session } => {
96fdf90aacd6atagen2026-09-08 08:24 UTC86
                let mut recaptcha = uiaa::ReCaptcha::new(response);
96fdf90aacd6atagen2026-09-08 08:24 UTC87
                recaptcha.session = session;
96fdf90aacd6atagen2026-09-08 08:24 UTC88
                Ok(uiaa::AuthData::ReCaptcha(recaptcha))
96fdf90aacd6atagen2026-09-08 08:24 UTC89
            }
96fdf90aacd6atagen2026-09-08 08:24 UTC90
            Self::Dummy { session } => {
96fdf90aacd6atagen2026-09-08 08:24 UTC91
                let mut dummy = uiaa::Dummy::new();
96fdf90aacd6atagen2026-09-08 08:24 UTC92
                dummy.session = session;
96fdf90aacd6atagen2026-09-08 08:24 UTC93
                Ok(uiaa::AuthData::Dummy(dummy))
96fdf90aacd6atagen2026-09-08 08:24 UTC94
            }
96fdf90aacd6atagen2026-09-08 08:24 UTC95
            Self::FallbackAcknowledgement { session } => {
96fdf90aacd6atagen2026-09-08 08:24 UTC96
                Ok(uiaa::AuthData::fallback_acknowledgement(session))
96fdf90aacd6atagen2026-09-08 08:24 UTC97
            }
96fdf90aacd6atagen2026-09-08 08:24 UTC98
            Self::OAuth { session } => {
96fdf90aacd6atagen2026-09-08 08:24 UTC99
                let mut oauth = uiaa::OAuth::new();
96fdf90aacd6atagen2026-09-08 08:24 UTC100
                oauth.session = session;
96fdf90aacd6atagen2026-09-08 08:24 UTC101
                Ok(uiaa::AuthData::OAuth(oauth))
96fdf90aacd6atagen2026-09-08 08:24 UTC102
            }
96fdf90aacd6atagen2026-09-08 08:24 UTC103
            Self::Stage {
96fdf90aacd6atagen2026-09-08 08:24 UTC104
                auth_type,
96fdf90aacd6atagen2026-09-08 08:24 UTC105
                session,
96fdf90aacd6atagen2026-09-08 08:24 UTC106
                data,
96fdf90aacd6atagen2026-09-08 08:24 UTC107
            } => uiaa::AuthData::new(&auth_type, session, data).map_err(|error| error.to_string()),
96fdf90aacd6atagen2026-09-08 08:24 UTC108
        }
96fdf90aacd6atagen2026-09-08 08:24 UTC109
    }
96fdf90aacd6atagen2026-09-08 08:24 UTC110
}
96fdf90aacd6atagen2026-09-08 08:24 UTC111
96fdf90aacd6atagen2026-09-08 08:24 UTC112
impl fmt::Debug for InteractiveAuth {
96fdf90aacd6atagen2026-09-08 08:24 UTC113
    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
96fdf90aacd6atagen2026-09-08 08:24 UTC114
        match self {
96fdf90aacd6atagen2026-09-08 08:24 UTC115
            Self::Password {
96fdf90aacd6atagen2026-09-08 08:24 UTC116
                password: _,
96fdf90aacd6atagen2026-09-08 08:24 UTC117
                session,
96fdf90aacd6atagen2026-09-08 08:24 UTC118
            } => formatter
96fdf90aacd6atagen2026-09-08 08:24 UTC119
                .debug_struct("Password")
96fdf90aacd6atagen2026-09-08 08:24 UTC120
                .field("session", &session.as_ref().map(|_| "..."))
96fdf90aacd6atagen2026-09-08 08:24 UTC121
                .finish_non_exhaustive(),
96fdf90aacd6atagen2026-09-08 08:24 UTC122
            Self::ReCaptcha {
96fdf90aacd6atagen2026-09-08 08:24 UTC123
                response: _,
96fdf90aacd6atagen2026-09-08 08:24 UTC124
                session,
96fdf90aacd6atagen2026-09-08 08:24 UTC125
            } => formatter
96fdf90aacd6atagen2026-09-08 08:24 UTC126
                .debug_struct("ReCaptcha")
96fdf90aacd6atagen2026-09-08 08:24 UTC127
                .field("session", &session.as_ref().map(|_| "..."))
96fdf90aacd6atagen2026-09-08 08:24 UTC128
                .finish_non_exhaustive(),
96fdf90aacd6atagen2026-09-08 08:24 UTC129
            Self::Dummy { session } => formatter
96fdf90aacd6atagen2026-09-08 08:24 UTC130
                .debug_struct("Dummy")
96fdf90aacd6atagen2026-09-08 08:24 UTC131
                .field("session", &session.as_ref().map(|_| "..."))
96fdf90aacd6atagen2026-09-08 08:24 UTC132
                .finish(),
96fdf90aacd6atagen2026-09-08 08:24 UTC133
            Self::FallbackAcknowledgement { session: _ } => formatter
96fdf90aacd6atagen2026-09-08 08:24 UTC134
                .debug_struct("FallbackAcknowledgement")
96fdf90aacd6atagen2026-09-08 08:24 UTC135
                .field("session", &"...")
96fdf90aacd6atagen2026-09-08 08:24 UTC136
                .finish(),
96fdf90aacd6atagen2026-09-08 08:24 UTC137
            Self::OAuth { session } => formatter
96fdf90aacd6atagen2026-09-08 08:24 UTC138
                .debug_struct("OAuth")
96fdf90aacd6atagen2026-09-08 08:24 UTC139
                .field("session", &session.as_ref().map(|_| "..."))
96fdf90aacd6atagen2026-09-08 08:24 UTC140
                .finish(),
96fdf90aacd6atagen2026-09-08 08:24 UTC141
            Self::Stage {
96fdf90aacd6atagen2026-09-08 08:24 UTC142
                auth_type,
96fdf90aacd6atagen2026-09-08 08:24 UTC143
                session,
96fdf90aacd6atagen2026-09-08 08:24 UTC144
                data: _,
96fdf90aacd6atagen2026-09-08 08:24 UTC145
            } => formatter
96fdf90aacd6atagen2026-09-08 08:24 UTC146
                .debug_struct("Stage")
96fdf90aacd6atagen2026-09-08 08:24 UTC147
                .field("auth_type", auth_type)
96fdf90aacd6atagen2026-09-08 08:24 UTC148
                .field("session", &session.as_ref().map(|_| "..."))
96fdf90aacd6atagen2026-09-08 08:24 UTC149
                .finish_non_exhaustive(),
96fdf90aacd6atagen2026-09-08 08:24 UTC150
        }
96fdf90aacd6atagen2026-09-08 08:24 UTC151
    }
96fdf90aacd6atagen2026-09-08 08:24 UTC152
}
96fdf90aacd6atagen2026-09-08 08:24 UTC153
96fdf90aacd6atagen2026-09-08 08:24 UTC154
#[derive(Clone, Eq, PartialEq)]
96fdf90aacd6atagen2026-09-08 08:24 UTC155
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
96fdf90aacd6atagen2026-09-08 08:24 UTC156
#[non_exhaustive]
96fdf90aacd6atagen2026-09-08 08:24 UTC157
pub struct InteractiveAuthChallenge {
96fdf90aacd6atagen2026-09-08 08:24 UTC158
    pub flows: Vec<InteractiveAuthFlow>,
96fdf90aacd6atagen2026-09-08 08:24 UTC159
    pub completed: Vec<String>,
96fdf90aacd6atagen2026-09-08 08:24 UTC160
    pub parameters_json: Option<String>,
96fdf90aacd6atagen2026-09-08 08:24 UTC161
    pub session: Option<String>,
96fdf90aacd6atagen2026-09-08 08:24 UTC162
    pub error: Option<InteractiveAuthFailure>,
96fdf90aacd6atagen2026-09-08 08:24 UTC163
}
96fdf90aacd6atagen2026-09-08 08:24 UTC164
96fdf90aacd6atagen2026-09-08 08:24 UTC165
impl fmt::Debug for InteractiveAuthChallenge {
96fdf90aacd6atagen2026-09-08 08:24 UTC166
    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
96fdf90aacd6atagen2026-09-08 08:24 UTC167
        formatter
96fdf90aacd6atagen2026-09-08 08:24 UTC168
            .debug_struct("InteractiveAuthChallenge")
96fdf90aacd6atagen2026-09-08 08:24 UTC169
            .field("flows", &self.flows)
96fdf90aacd6atagen2026-09-08 08:24 UTC170
            .field("completed", &self.completed)
96fdf90aacd6atagen2026-09-08 08:24 UTC171
            .field(
96fdf90aacd6atagen2026-09-08 08:24 UTC172
                "parameters_json",
96fdf90aacd6atagen2026-09-08 08:24 UTC173
                &self.parameters_json.as_ref().map(|_| "..."),
96fdf90aacd6atagen2026-09-08 08:24 UTC174
            )
96fdf90aacd6atagen2026-09-08 08:24 UTC175
            .field("session", &self.session.as_ref().map(|_| "..."))
96fdf90aacd6atagen2026-09-08 08:24 UTC176
            .field("error", &self.error)
96fdf90aacd6atagen2026-09-08 08:24 UTC177
            .finish()
96fdf90aacd6atagen2026-09-08 08:24 UTC178
    }
96fdf90aacd6atagen2026-09-08 08:24 UTC179
}
96fdf90aacd6atagen2026-09-08 08:24 UTC180
96fdf90aacd6atagen2026-09-08 08:24 UTC181
impl From<&uiaa::UiaaInfo> for InteractiveAuthChallenge {
96fdf90aacd6atagen2026-09-08 08:24 UTC182
    fn from(info: &uiaa::UiaaInfo) -> Self {
96fdf90aacd6atagen2026-09-08 08:24 UTC183
        Self {
96fdf90aacd6atagen2026-09-08 08:24 UTC184
            flows: info
96fdf90aacd6atagen2026-09-08 08:24 UTC185
                .flows
96fdf90aacd6atagen2026-09-08 08:24 UTC186
                .iter()
96fdf90aacd6atagen2026-09-08 08:24 UTC187
                .map(|flow| InteractiveAuthFlow {
96fdf90aacd6atagen2026-09-08 08:24 UTC188
                    stages: flow
96fdf90aacd6atagen2026-09-08 08:24 UTC189
                        .stages
96fdf90aacd6atagen2026-09-08 08:24 UTC190
                        .iter()
96fdf90aacd6atagen2026-09-08 08:24 UTC191
                        .map(|stage| stage.as_str().to_owned())
96fdf90aacd6atagen2026-09-08 08:24 UTC192
                        .collect(),
96fdf90aacd6atagen2026-09-08 08:24 UTC193
                })
96fdf90aacd6atagen2026-09-08 08:24 UTC194
                .collect(),
96fdf90aacd6atagen2026-09-08 08:24 UTC195
            completed: info
96fdf90aacd6atagen2026-09-08 08:24 UTC196
                .completed
96fdf90aacd6atagen2026-09-08 08:24 UTC197
                .iter()
96fdf90aacd6atagen2026-09-08 08:24 UTC198
                .map(|stage| stage.as_str().to_owned())
96fdf90aacd6atagen2026-09-08 08:24 UTC199
                .collect(),
96fdf90aacd6atagen2026-09-08 08:24 UTC200
            parameters_json: info.params.as_ref().map(|params| params.get().to_owned()),
96fdf90aacd6atagen2026-09-08 08:24 UTC201
            session: info.session.clone(),
96fdf90aacd6atagen2026-09-08 08:24 UTC202
            error: info
96fdf90aacd6atagen2026-09-08 08:24 UTC203
                .auth_error
96fdf90aacd6atagen2026-09-08 08:24 UTC204
                .as_ref()
96fdf90aacd6atagen2026-09-08 08:24 UTC205
                .map(|error| InteractiveAuthFailure {
96fdf90aacd6atagen2026-09-08 08:24 UTC206
                    code: error.kind.errcode().as_str().to_owned(),
96fdf90aacd6atagen2026-09-08 08:24 UTC207
                    message: error.message.clone(),
96fdf90aacd6atagen2026-09-08 08:24 UTC208
                }),
96fdf90aacd6atagen2026-09-08 08:24 UTC209
        }
96fdf90aacd6atagen2026-09-08 08:24 UTC210
    }
96fdf90aacd6atagen2026-09-08 08:24 UTC211
}
96fdf90aacd6atagen2026-09-08 08:24 UTC212
96fdf90aacd6atagen2026-09-08 08:24 UTC213
#[derive(Clone, Debug, Eq, PartialEq)]
96fdf90aacd6atagen2026-09-08 08:24 UTC214
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
96fdf90aacd6atagen2026-09-08 08:24 UTC215
#[non_exhaustive]
96fdf90aacd6atagen2026-09-08 08:24 UTC216
pub struct InteractiveAuthFlow {
96fdf90aacd6atagen2026-09-08 08:24 UTC217
    pub stages: Vec<String>,
96fdf90aacd6atagen2026-09-08 08:24 UTC218
}
96fdf90aacd6atagen2026-09-08 08:24 UTC219
96fdf90aacd6atagen2026-09-08 08:24 UTC220
#[derive(Clone, Debug, Eq, PartialEq)]
96fdf90aacd6atagen2026-09-08 08:24 UTC221
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
96fdf90aacd6atagen2026-09-08 08:24 UTC222
#[non_exhaustive]
96fdf90aacd6atagen2026-09-08 08:24 UTC223
pub struct InteractiveAuthFailure {
96fdf90aacd6atagen2026-09-08 08:24 UTC224
    pub code: String,
96fdf90aacd6atagen2026-09-08 08:24 UTC225
    pub message: String,
96fdf90aacd6atagen2026-09-08 08:24 UTC226
}
96fdf90aacd6atagen2026-09-08 08:24 UTC227
96fdf90aacd6atagen2026-09-08 08:24 UTC228
#[derive(Clone, Debug, Eq, PartialEq)]
96fdf90aacd6atagen2026-09-08 08:24 UTC229
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
96fdf90aacd6atagen2026-09-08 08:24 UTC230
pub enum InteractiveAuthOutcome {
96fdf90aacd6atagen2026-09-08 08:24 UTC231
    Completed,
96fdf90aacd6atagen2026-09-08 08:24 UTC232
    Challenge(InteractiveAuthChallenge),
96fdf90aacd6atagen2026-09-08 08:24 UTC233
}