client-api: Fix login request deserialization

This commit is contained in:
Jonas Platte 2021-10-15 17:09:02 +02:00
parent 44cfd0adbc
commit 58cdcae1f9
No known key found for this signature in database
GPG Key ID: CC154DE0E30B7C67

View File

@ -9,7 +9,7 @@ use serde::{
de::{self, DeserializeOwned}, de::{self, DeserializeOwned},
Deserialize, Deserializer, Serialize, Deserialize, Deserializer, Serialize,
}; };
use serde_json::{value::RawValue as RawJsonValue, Value as JsonValue}; use serde_json::Value as JsonValue;
use crate::r0::uiaa::{IncomingUserIdentifier, UserIdentifier}; use crate::r0::uiaa::{IncomingUserIdentifier, UserIdentifier};
@ -141,28 +141,19 @@ impl<'de> Deserialize<'de> for IncomingLoginInfo {
where where
D: Deserializer<'de>, D: Deserializer<'de>,
{ {
fn from_raw_json_value<T: DeserializeOwned, E: de::Error>( fn from_json_value<T: DeserializeOwned, E: de::Error>(val: JsonValue) -> Result<T, E> {
raw: &RawJsonValue, serde_json::from_value(val).map_err(E::custom)
) -> Result<T, E> {
serde_json::from_str(raw.get()).map_err(E::custom)
} }
let json = Box::<RawJsonValue>::deserialize(deserializer)?; // FIXME: Would be better to use serde_json::value::RawValue, but that would require
// implementing Deserialize manually for Request, bc. `#[serde(flatten)]` breaks things.
let json = JsonValue::deserialize(deserializer)?;
#[derive(Deserialize)] let login_type = json["type"].as_str().ok_or_else(|| de::Error::missing_field("type"))?;
struct ExtractType<'a> { match login_type {
#[serde(borrow, rename = "type")] "m.login.password" => from_json_value(json).map(Self::Password),
login_type: Cow<'a, str>, "m.login.token" => from_json_value(json).map(Self::Token),
} _ => from_json_value(json).map(Self::_Custom),
let login_type = serde_json::from_str::<ExtractType<'_>>(json.get())
.map_err(de::Error::custom)?
.login_type;
match &*login_type {
"m.login.password" => from_raw_json_value(&json).map(Self::Password),
"m.login.token" => from_raw_json_value(&json).map(Self::Token),
_ => from_raw_json_value(&json).map(Self::_Custom),
} }
} }
} }